代码之家  ›  专栏  ›  技术社区  ›  James

流式jpeg,检测jpeg结束

  •  3
  • James  · 技术社区  · 16 年前

    我已经创建了一个Java服务器,它需要截图,将它们重新编译,然后通过TCP/IP发送到我的iPhone应用程序。然后,应用程序使用nsinputstream收集传入的图像数据,使用字节缓冲区创建nsmutabledata实例,然后创建uiimage对象以显示在iphone上。基本上是屏幕分享。我收集图像数据的iphone代码目前如下:

    - (void)stream:(NSStream *)theStream handleEvent:(NSStreamEvent)streamEvent{
    
    
    if(streamEvent == NSStreamEventHasBytesAvailable && [iStream hasBytesAvailable]){
            uint8_t buffer[1024];
    
        while([iStream hasBytesAvailable]){
            NSLog(@"New Data");
    
            int len = [iStream read:buffer maxLength:sizeof(buffer)];
    
            [imgdata appendBytes:buffer length:len];
            fullen=fullen+len;
    
            /*Here is where the problem lies.  What should be in this
             if statement in order to make it test the last byte of
             the incoming buffer, to tell if it is the End of Image marker
             for the end of incoming JPEG file?
             */
            if(buffer[len]=='FFD9'){
            UIImage *img = [[UIImage alloc] initWithData:imgdata];
            NSLog(@"NUMBER OF BYTES: %u", len);
    
            image.image = img;
            }
        }
    
    }
    }
    

    正如代码中的注释所指出的,我的问题是找出何时停止在nsmutabledata对象中收集数据,并使用这些数据创建uiimage。在传入字节中查找jpeg文件结束标记(eoi)marker(ffd9)似乎是有意义的,因为在发送该标记时,图像将准备好显示。我怎么测试这个?我可能遗漏了一些关于数据是如何存储的,或者是关于jpeg文件中的标记的信息,但是在测试这方面的任何帮助都将非常感谢!

    詹姆斯

    1 回复  |  直到 16 年前
        1
  •  3
  •   bbum    16 年前

    很明显,您不想关闭流,因为这样会降低性能。

    因为您控制了客户机-服务器连接,所以在发送图像数据之前,先向下发送图像中的字节数。更好的方法是,在图像、图像数据中向下发送字节数,并在最后发送一个易于识别的串行数据,这样您就可以快速验证数据是否已实际到达。

    比实际检查文件结束标记要容易得多,效率也更高。当然,你也可以在收到字节后检查一下。足够简单。

    当然,除了不寻常的情况外,所有这些对于电影分享风格来说都是非常低效的。在大多数情况下,只有一小部分屏幕被镜像,实际改变每一帧。如果你试着每帧都发送整个屏幕,你的连接会很快饱和,客户端会严重滞后和无响应。

    考虑到这是一个非常成熟的市场,有大量的解决方案和相当多的开源代码,您可以从中派生出满足您需求的解决方案(例如,请参阅vnc)。