2010-03-05 78 views
3

我已经创建了一个java服务器,它可以截取屏幕截图,调整它们大小,并通过TCP/IP将它们发送到我的iPhone应用程序。然后,应用程序使用NSInputStream收集传入的图像数据,使用字节缓冲区创建一个NSMutableData实例,然后创建一个UIImage对象以在iPhone上显示。屏幕共享,本质上。我的iPhone的代码来收集图像数据目前情况如下:流式传输JPEG,检测JPEG结束

- (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文件中的标记,但是在测试中有任何帮助将不胜感激!

詹姆斯

+0

1)'buffer [len]'超过了它所读取的块的末尾,这只是'len'字节长(因此最后一个索引是'len-1'和2)''FFD9'是不是一个字节,它是4个字节;你可能是指'0xFFD9',它是2个字节,但你必须以某种方式读取最后2个字节,而不是最后一个字节;然后你必须单独测试字节,否则不得不担心排序 – user102008 2011-04-29 21:59:54

回答

3

你显然不希望关闭流,因为这会杀了性能。

由于您控制客户端服务器连接,请在发送图像数据之前发送图像中的字节数。更好的方法是,发送图像中的字节数,图像数据以及最后一个容易识别的序列号,以便快速验证数据是否已实际到达。

比实际检查文件标记结束更容易,更有效。虽然,当然,您也可以在接收到#字节后检查它是否也是如此。很简单。

当然,除了不常见的情况外,所有这些对于屏幕共享风格来说都是非常低效的。在大多数情况下,只有一小部分被镜像的屏幕实际上随着每一帧而改变。如果你试图用每一帧发送整个屏幕,你很快就会饱和你的连接,客户端将会变得非常迟缓而且没有反应。

鉴于这是一个非常成熟的市场,有大量的解决方案和相当多的开源代码位,您可以从中获得适合您需求的解决方案(请参阅VNC)。

+0

所有伟大的建议,谢谢! – James 2010-03-06 16:59:05