3

在 Apple 的文档中AVAssetReaderTrackOutput,它表示以下有关outputSettings使用实例化实例时的参数+[AVAssetReaderTrackOutput assetReaderTrackOutputWithTrack:outputSettings:]

nil 值将输出配置为以指定轨道存储的原始格式提供样本。

当在例如 MP4 视频资产上使用它时,它似乎会按解码顺序逐步遍历帧(即相对于显示无序),但是CMSampleBufferRef对使用CMSampleBufferGetImageBuffer产生NULL CVImageBufferRef对象的传递对象的所有查询。

我可以确保传递图像缓冲区对象的唯一方法是为提供像素缓冲区格式outputSettings:,例如字典条目。kCVPixelFormatType_32ARGBkCVPixelBufferPixelFormatTypeKey

这样做的另一个有趣的副作用是,帧然后按显示顺序传递,而帧的底层解码顺序被抽象/隐藏起来。

任何想法为什么会这样?

4

1 回答 1

3

像您一样,我希望设置 an outputSettingsofnil会导致输出本机格式视频帧,但事实并非如此,您必须指定一些内容才能获得有效的CVSampleBufferRef.

一切都没有丢失,使用“几乎没有”的字典似乎以它们的本机格式输出帧,

AVAsset asset = [AVURLAsset URLAssetWithURL:inputURL options:nil];
AVAssetTrack *videoTrack = [[asset tracksWithMediaCharacteristic:AVMediaCharacteristicVisual] objectAtIndex:0];

NSDictionary *decompressionSettings =
     @{ (id)kCVPixelBufferIOSurfacePropertiesKey : [NSDictionary dictionary] };
AVAssetReaderTrackOutput trackOutput = [[AVAssetReaderTrackOutput alloc] initWithTrack:videoTrack outputSettings:decompressionSettings];
...

IOSurfaceOptions 只是默认设置 - 进一步阅读以供参考:https ://developer.apple.com/documentation/corevideo/kcvpixelbufferiosurfacepropertieskey?language=objc

于 2019-07-17T20:56:40.497 回答