如何获取中的错误/警告

我有一个MJPEGstream超过RTSP / UDP从中我想为[UIImage initWithData:]生成UIImageView的JPEG。 大多数情况下,这工作正常,但有时我得到像下面的腐败的图像和日志消息:

ImageIO: <ERROR> JPEGCorrupt JPEG data: premature end of data segment 

我的问题是:我怎么看(在运行时),这样的消息发生? 不幸的是,'initWithData'没有错误输出,有没有其他方法?

谢谢。

编辑:在这种情况下,initWithData确实返回一个有效的UIImage对象,而不是零!

在堆栈溢出中有一个类似的线程: 捕捉错误:损坏的JPEG数据:数据段的提前结束 。

有解决办法是检查头字节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"); } 

希望这可以帮助!

在这种情况下, initWithData:方法应该返回nil

试试:

 UIImage *myImage = [[UIImage alloc] initWithData:imgData]; if(!myImage) { // problem } 

我在这种情况下遇到了同样的问题。

事实certificate,我正在传递一个NSMutableData的实例全局队列解码。 在解码期间,NSMutableData中的数据被从networking接收到的下一帧覆盖。

我通过传递数据的副本来解决错误。 使用缓冲池来提高性能可能会更好:

  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 }); });