2014-01-22 89 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); 

我想我明白爲什麼,但至少現在的工作。