【问题标题】:JPEG Corrupt JPEG data: 2 extraneous bytes before marker 0xdbJPEG 损坏的 JPEG 数据:标记 0xdb 之前的 2 个无关字节
【发布时间】:2014-10-21 10:27:55
【问题描述】:

我正在开发一个应用程序,我必须在其中显示来自 ip cam 的视频流,我已经使用了 SPMJPEG 流。这是我的代码 sn-p--

-(void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data
{

@try
{

[_receivedData appendData:data];

NSRange beginRange = [_receivedData rangeOfData:_beginMarkerData
                                        options:0
                                          range:NSMakeRange(0, _receivedData.length)];

NSRange endRange = [_receivedData rangeOfData:_endMarkerData
                                      options:0
                                range:NSMakeRange(beginRange.location+beginRange.length,     _receivedData.length - (beginRange.location+beginRange.length))];


if(endRange.location != NSNotFound)
{
long endLocation = endRange.location + endRange.length;

if (_receivedData.length >= endLocation)
{
//Getting data in imageData in both iOS 7 and iOS 8
NSData *imageData = [_receivedData subdataWithRange:NSMakeRange(beginRange.location,     endLocation-beginRange.location)];

            [_receivedData replaceBytesInRange:NSMakeRange(0, endLocation) withBytes:NULL length:0];

UIImage *receivedImage = nil;
//Getting data in receivedImage in iOS 7 but not in iOS 8, returning nil image in iOS 8
receivedImage = [UIImage imageWithData:imageData];

if (receivedImage)
{
            static double movieSize = 0;
            movieSize += imageData.length;

            NSLog(@"Frame size in kb: %f, since begining: %f", imageData.length / 1024.0, movieSize / 1024.0);

            double delay = (!lastFrameDate) ? 0 : -[lastFrameDate timeIntervalSinceNow];

            lastFrameDate = [NSDate date];

            self.frame = [SPMJPEGFrame frameWithImage:receivedImage timeDelay:delay];
        }
    }
}
       }
@catch (NSException *e)
{
    UIAlertView *alert=[[UIAlertView alloc]initWithTitle:@"Warnning!" message:[e description] delegate:nil cancelButtonTitle:@"Ok" otherButtonTitles:nil, nil];
    [alert show];
    return;

}
}

它在 iOS 7 中运行良好,但在 iOS 8 中根本无法运行,我收到错误“ImageIO: JPEG Corrupt JPEG data: 2 extraneous bytes before marker 0xdb”但在 iOS 7 中这不是问题但是正如我从谷歌搜索中得知的那样,iOS 8 不允许在 UIImageView 中显示损坏的 JPEG 图像。(我正在使用 UIImageView 来显示流 url)请帮助我解决同样的问题,提前致谢。

【问题讨论】:

    标签: ios jpeg


    【解决方案1】:

    基于类似的投诉,IOS 8 JPEG 解码器听起来比 IOS 7 版本更严格。我自己的理论是一些编码器在计数标记之后插入额外的字节。到目前为止,还没有人花时间去鉴定:

    1. 什么应用程序正在创建这些 JPEG 图像
    2. 什么标记导致问题

    FFDB 是一个定义量化表标记。也许你可以知道是什么在创建 JPEG 文件,你可以运行某种类型的 JPEG 转储程序来分析流的结构。我怀疑你会发现:

       FF<Marker ID><2-byte length = L><L bytes of data><2 more bytes>FFDB 
    

    我的赌注是问题标记是一个错误的 EXIF 标头。

    同时,可能的解决方案是:

    一个。使用不同的 JPEG 编码器 湾。编写一个简单的过滤器来删除 JPEG 流中的多余字节。

    【讨论】:

    • 感谢您宝贵的时间,我对 JPEG 的了解不够,我们可以删除 JPEG 流中多余的字节,如果您有任何相关信息,请分享和我一起,谢谢。
    • 你必须在这里做一些分析。我会得到一个分析文件结构的 JPEG 转储程序,以确保我的理论是现实的。如果我是对的,那么要做的方法是创建一个简单的过滤器,它可以识别各种 JPEG 标记并可以识别具有长度的标记。然后它将使用长度复制 jpeg 流并忽略额外的字节。
    猜你喜欢
    • 2018-04-04
    • 2017-08-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-08-14
    • 1970-01-01
    • 2015-03-10
    相关资源
    最近更新 更多