我创建了一台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。在传入字节中,查找文件标记(EOI)标记(FFD9)的JPEG末端似乎是有意义的,因为在发送此图时,图像可以显示。我该如何测试?我要么缺少有关数据的存储方式,要么就JPEG文件中的标记遗漏了一些内容,但是对此进行测试的任何帮助都将不胜感激!

詹姆士

有帮助吗?

解决方案

您显然不想关闭流,因为那会杀死性能。

由于您控制了客户端服务器连接,因此在发送图像数据之前,请在图像中发送字节#。更好的是,在映像,图像数据和易于识别的序列#中发送#字节#,以便您可以快速验证数据实际到达。

比实际检查文件标记的结尾要容易得多,更有效。但是,当然,您也可以在收到字节#之后检查一下。足够容易。

当然,除了异常情况外,所有这些都将严重为屏幕截图风格的目的而严重降低。在大多数情况下,只有一小部分要镜像的屏幕实际上都会改变每个帧。如果您尝试使用每帧发送整个屏幕,您将迅速饱和您的连接,客户端将非常卑鄙且无反应。

鉴于这是一个极其成熟的市场,因此有很多解决方案和许多开源位,您可以从中得出满足您需求的解决方案(例如,请参阅VNC)。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top