3

我创建了一个 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) 标记 (FFD9)——似乎是有意义的,因为在发送时图像将准备好显示。我该如何测试呢?我要么遗漏了有关数据如何存储的信息,要么遗漏了 JPEG 文件中的标记,但是对此测试的任何帮助将不胜感激!

詹姆士

4

1 回答 1

3

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

由于您控制客户端服务器连接,因此在发送图像数据之前先发送图像中的字节数。更好的是,在最后发送图像中的字节数、图像数据和一个易于识别的序列号,这样您就可以快速验证数据是否实际到达。

比实际检查文件结尾标记更容易和更有效。当然,您也可以在收到 # of bytes 之后检查它。很容易。

当然,除了不寻常的情况外,所有这些对于屏幕共享风格的目的来说都是非常低效的。在大多数情况下,实际上只有一小部分要镜像的屏幕会随着每一帧的变化而变化。如果您尝试在每一帧都发送整个屏幕,您将很快使您的连接饱和,并且客户端将非常滞后且无响应。

鉴于这是一个非常成熟的市场,有大量的解决方案和相当多的开源位,您可以从中派生出适合您需求的解决方案(例如,参见 VNC)。

于 2010-03-05T04:48:43.963 回答