我的代码已经运行了很长时间,但我最近有 2 台新的网络摄像机通过 HTTP 运行高分辨率 MJPEG 图像流,并且我看到两台摄像机的损坏 JPEG 如下所示。所以很确定它与硬件无关。较旧的低分辨率相机仍然可以正常工作。
到目前为止我一直在使用的方法:
UIImage *image = [UIImage imageWithData:data]
这一直工作正常,我一直在确保我的 JPEG 以 0xff 0xd8 开头并以 0xff 0xd9 结尾。
有了更大的图像,我现在得到:
<Error>: ImageIO: JPEG Corrupt JPEG data: bad Huffman code
<Error>: ImageIO: JPEG Corrupt JPEG data: premature end of data segment
所以我决定试试 libturbojpeg,它显示了类似的解码视觉伪影,但没有错误消息。
流似乎可以通过浏览器正常工作......但是如果我从模拟器中保存一个帧,然后加载到浏览器中,工件就在那里。
我正在使用 GCDAsyncSocket 进行网络连接,它也可以正常工作很长时间了。
所以我想知道是否有人可以阐明事情可能在哪里被破坏了。如果网络数据丢失了,我怀疑我会得到完整的帧,或者预期的 15fps,(虽然我不知道 JPEG 对丢失有多敏感......)但我想不出还有什么可能导致这种问题。
1001 0x0D 0x0A--ThisString 0x0AContent-type:image/jpeg 0x0AContent-Length:17137 0x0A 0x0A 0xFF 0xD8 ...
... 0xFF 0xD9 0x0D 0x0A103f 0x0D 0x0A--ThisString 0x0AContent-type:image/jpeg 0x0AContent-Length:17894 0x0A 0x0A 0xFF 0xD8 ...
更新:我已经尝试更换网络层,并看到相同的图像损坏,用完了可以尝试的东西。我还尝试将图像保存到磁盘,它从磁盘加载到已经损坏的浏览器中。如果我将浏览器指向源流,图像到达没有问题。