2014-01-22 62 views
0

我正在写一个应用程序,它使用AVKit读取一个视频文件,并对每一帧执行一些操作,最后生成一个输出图像。AVAssetReaderTrackOutput有时提供空白视频帧

首先,我将资源加载,与AVURLAssetPreferPreciseDurationAndTimingKey设置为YES,然后我找到的第一个视频轨道,并创建一个资产读者,并设置为kCVPixelFormatType_32BGRA减压设置的资产读卡器输出 - 根据文档,这是一个这里少数允许的值。

然后我打电话copyNextSampleBuffer在一个循环,并做所产生的CMSampleBufferRef如下:

CVImageBufferRef movieFrame = CMSampleBufferGetImageBuffer(sampleBuffer); 
NSCIImageRep *imageRep = [NSCIImageRep 
    imageRepWithCIImage:[CIImage imageWithCVImageBuffer:movieFrame]]; 

NSImage *image = [[NSImage alloc] initWithSize:[imageRep size]]; 
[image addRepresentation:imageRep]; 

在大多数情况下,这工作正常。但是,有些视频会生成偶尔的空白帧,还有一些视频会为每个帧留出空白。我在这里做了明显错误的事吗?

回答

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

我想我明白为什么,但至少现在的工作。