我正在编写一个使用AVKit读取视频文件的应用程序,并对每个帧执行某些操作,最终生成输出图像。
首先我加载资源,AVURLAssetPreferPreciseDurationAndTimingKey
设置为YES
,然后找到第一个视频曲目,并创建资产阅读器和资产阅读器输出,并将解压缩设置设置为{{ 1}} - 根据文档,这是这里为数不多的允许值之一。
然后我在循环中调用kCVPixelFormatType_32BGRA
,并使用生成的copyNextSampleBuffer
执行以下操作:
CMSampleBufferRef
在大多数情况下,这很好用。然而,有些视频会产生偶尔出现的空白帧,而有些视频会产生空白帧。我在这里做了一些明显不对的事吗?
答案 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);
我希望我理解为什么,但至少它现在有效。