我已经创建了一个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 of File标记-- End of Image (EOI)标记(FFD9)似乎很有意义,因为发送此消息时图像将准备好显示。我该如何测试它呢?我错过了一些关于数据如何存储的东西,或者关于JPEG文件中的标记的东西,但对此测试的任何帮助都将不胜感激!
詹姆斯
发布于 2010-03-05 12:48:44
您显然不想关闭流,因为这会降低性能。
由于您控制客户端服务器连接,因此在发送图像数据之前,请先发送图像中的字节数。更好的做法是,发送图像中的字节数、图像数据以及最后易于识别的序列号,这样您就可以快速验证数据是否已实际到达。
比实际检查文件结尾标记要容易得多,也更有效。当然,您也可以在接收到字节数后进行检查。很简单。
当然,所有这些对于屏幕共享风格的目的来说都是非常低效的,除非是在不寻常的情况下。在大多数情况下,只有一小部分要镜像的屏幕实际上会随着每帧的变化而变化。如果你试图在每一帧中发送整个屏幕,你会很快使你的连接饱和,客户端将会非常迟钝和没有反应。
鉴于这是一个非常成熟的市场,有大量的解决方案和相当多的开放源码代码,您可以从中派生出满足您需求的解决方案(例如,请参见VNC )。
https://stackoverflow.com/questions/2384198
复制相似问题