AVAssetReaderTrackOutput有时会提供空白视频帧

时间:2014-01-22 21:11:43

标签: macos cocoa video

我正在编写一个使用AVKit读取视频文件的应用程序,并对每个帧执行某些操作,最终生成输出图像。

首先我加载资源,AVURLAssetPreferPreciseDurationAndTimingKey设置为YES,然后找到第一个视频曲目,并创建资产阅读器和资产阅读器输出,并将解压缩设置设置为{{ 1}} - 根据文档,这是这里为数不多的允许值之一。

然后我在循环中调用kCVPixelFormatType_32BGRA,并使用生成的copyNextSampleBuffer执行以下操作:

CMSampleBufferRef

在大多数情况下,这很好用。然而,有些视频会产生偶尔出现的空白帧,而有些视频会产生空白帧。我在这里做了一些明显不对的事吗?

1 个答案:

答案 0 :(得分:0)

好吧,我最终解决了这个问题。偶尔的空白帧是由于线程问题造成的,并且通过使用以下内容来创建NSImage来解决始终为空的帧:

CVPixelBufferLockBaseAddress(movieFrame,0);
uint8_t *baseAddress = (uint8_t *)CVPixelBufferGetBaseAddress(movieFrame);
size_t bytesPerRow = CVPixelBufferGetBytesPerRow(movieFrame);
size_t width = CVPixelBufferGetWidth(movieFrame);
size_t height = CVPixelBufferGetHeight(movieFrame);

CGColorSpaceRef colorSpace = CGColorSpaceCreateDeviceRGB();
CGContextRef newContext = CGBitmapContextCreate(baseAddress,
                                                width, height, 8,
                                                bytesPerRow,
                                                colorSpace, 
                                      kCGBitmapByteOrder32Little |
                                      kCGImageAlphaNoneSkipFirst);
CGImageRef frame = CGBitmapContextCreateImage(newContext);

CVPixelBufferUnlockBaseAddress(movieFrame,0);
CGContextRelease(newContext);
CGColorSpaceRelease(colorSpace);

NSImage *image = [[NSImage alloc] initWithCGImage:frame size:NSMakeSize(width,height)];

CGImageRelease(frame);

我希望我理解为什么,但至少它现在有效。