我有一个基于RTSP/UDP的MJPEG流,我想从这个流中用UIImage initWithData:为UIImageView生成MJPEG。大多数情况下,这样做效果很好,但有时我会得到损坏的图像和日志消息,如:
ImageIO: <ERROR> JPEGCorrupt JPEG data: premature end of data segment我的问题是:我如何(在运行时)看到这样的消息发生?不幸的是'initWithData‘没有错误输出,还有其他方法吗?
谢谢。
编辑:在这种情况下,initWithData会返回一个有效的UIImage对象,而不是nil!
发布于 2011-07-22 21:43:39
堆栈溢出上有一个与此类似的线程:Catching error: Corrupt JPEG data: premature end of data segment。
解决方案是检查报头字节FF D8和结束字节FF D9。所以,如果你在NSData中有图像数据,你可以像这样检查它:
- (BOOL)isJPEGValid:(NSData *)jpeg {
    if ([jpeg length] < 4) return NO;
    const char * bytes = (const char *)[jpeg bytes];
    if (bytes[0] != 0xFF || bytes[1] != 0xD8) return NO;
    if (bytes[[jpeg length] - 2] != 0xFF || bytes[[jpeg length] - 1] != 0xD9) return NO;
    return YES;
}然后,要检查JPEG数据是否无效,只需编写:
if (![self isJPEGValid:myData]) {
    NSLog(@"Do something here");
}希望这能有所帮助!
发布于 2011-07-22 17:37:15
在这种情况下,initWithData:方法应该返回nil。
尝试:
UIImage *myImage = [[UIImage alloc] initWithData:imgData];
if(!myImage) {
    // problem
}发布于 2013-11-24 00:54:22
在这种情况下,我也遇到过同样的问题。
结果是,我将一个NSMutableData实例传递给全局队列进行解码。在解码过程中,NSMutableData中的数据被从网络接收到的下一帧所覆盖。
我已经通过传递数据的副本修复了错误。使用缓冲池来提高性能可能会更好:
    NSData *dataCopy = [_receivedData copy];
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
    ZAssert([self isJPEGValid:dataCopy], @"JPEG data is invalid"); // should never happen
    UIImage *image = [UIImage imageWithData:dataCopy];
    dispatch_async(dispatch_get_main_queue(), ^{
        // show image
    });
});https://stackoverflow.com/questions/6788138
复制相似问题