Почему CMSampleBufferGetImageBuffer возвращает NULL
Я создал код для обработки видеофайлов в OSX, кадр за кадром. Ниже приведен отрывок из кода, который строит ОК, открывает файл, находит дорожку видео (только дорожку) и начинает читать CMSampleBuffers без проблем. Однако каждый CMSampleBufferRef, который я получаю, возвращает NULL, когда я пытаюсь извлечь кадр пиксельного буфера. Там'в документации iOS нет указаний на то, почему я мог ожидать NULL-возвращаемое значение или как я мог ожидать, чтобы исправить проблему. Это происходит со всеми видео, на которых ямы проверили его независимо от источника захвата или кодека.
Любая помощь с благодарностью.
NSString *assetInPath = @"/Users/Dave/Movies/movie.mp4";
NSURL *assetInUrl = [NSURL fileURLWithPath:assetInPath];
AVAsset *assetIn = [AVAsset assetWithURL:assetInUrl];
NSError *error;
AVAssetReader *assetReader = [AVAssetReader assetReaderWithAsset:assetIn error:&error];
AVAssetTrack *track = [assetIn.tracks objectAtIndex:0];
AVAssetReaderOutput *assetReaderOutput = [[AVAssetReaderTrackOutput alloc]
initWithTrack:track
outputSettings:nil];
[assetReader addOutput:assetReaderOutput];
// Start reading
[assetReader startReading];
CMSampleBufferRef sampleBuffer;
do {
sampleBuffer = [assetReaderOutput copyNextSampleBuffer];
/**
** At this point, sampleBuffer is non-null, has all appropriate attributes to indicate that
** it's a video frame, 320x240 or whatever and looks perfectly fine. But the next
** line always returns NULL without logging any obvious error message
**/
CVImageBufferRef pixelBuffer = CMSampleBufferGetImageBuffer(sampleBuffer);
if( pixelBuffer != NULL ) {
size_t width = CVPixelBufferGetWidth(pixelBuffer);
size_t height = CVPixelBufferGetHeight(pixelBuffer);
CVPixelBufferLockBaseAddress(pixelBuffer, 0);
...
other processing removed here for clarity
}
} while( ... );
Чтобы было ясно, яМы удалили весь код проверки ошибок, но в этом коде проблем не было. т.е. AVAssetReader читает, CMSampleBufferRef выглядит нормально и т. д.