【问题标题】:Streaming JPEGs, detect end of JPEG流式传输 JPEG,检测 JPEG 结束
【发布时间】:2010-03-05 12:48:43
【问题描述】:

我已经创建了一个 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 文件中的标记,但我们将非常感谢对此进行测试的任何帮助!

詹姆斯

【问题讨论】:

  • 1) buffer[len] 超过了它读取的块的末尾,它只有 len 字节长(因此最后一个索引是 len-1,并且 2)'FFD9' 不是byte,为4个字节;您可能是指0xFFD9,它是 2 个字节,但是您将不得不以某种方式读取最后 2 个字节,而不仅仅是最后一个字节;然后你必须单独测试字节,或者不得不担心字节顺序

标签: iphone objective-c nsstream nsinputstream


【解决方案1】:

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

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

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

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-01-20
    • 1970-01-01
    • 1970-01-01
    • 2012-09-08
    • 1970-01-01
    • 2013-07-18
    • 1970-01-01
    相关资源
    最近更新 更多