使用AVAssetWriter重新编码H264 mov文件 - 如何设置帧速率?

时间:2017-05-16 12:35:08

标签: ios avfoundation avassetwriter

我试图在iOS中重新编码具有可变帧速率和剪切持续时间的输入MOV文件。目前我有一个AVAssetWriter设置视频属性有点像这样:

NSMutableDictionary* compressionPropertiesDict = [NSMutableDictionary new];
compressionPropertiesDict[AVVideoProfileLevelKey] = AVVideoProfileLevelH264High40;

if(self.fps > 0) {
    compressionPropertiesDict[AVVideoAverageNonDroppableFrameRateKey] = [NSNumber numberWithInt:self.fps];


_sessionMgr.videoSettings = @
{
AVVideoCodecKey: AVVideoCodecH264,
AVVideoWidthKey: [NSNumber numberWithFloat:self.outputSize.width],
AVVideoHeightKey: [NSNumber numberWithFloat:self.outputSize.height],
AVVideoCompressionPropertiesKey: compressionPropertiesDict,
};

在运行时出现的情况如下:

videoSettings = 
{
AVVideoCodecKey = avc1;
AVVideoCompressionPropertiesKey =     {
    AverageNonDroppableFrameRate = 15;
    ProfileLevel = "H264_High_4_0";
};
AVVideoHeightKey = 960;
AVVideoWidthKey = 640;
}

最后,我遇到了NSInvalidArgumentException: "Compression property AverageNonDroppableFrameRate is not supported for video codec type avc1"的崩溃。 (在使用模拟器的单元测试中。)

在iOS中只有一种可用的编解码器类型,AVVideoCodecH264 /“avc1” - 我注意到其他项目使用了AVVideoAverageNonDroppableFrameRateKey。事实上,我正在使用SDAVAssetExportSession,在该代码库中我看到了这个键的明确使用。所以我原以为必须有办法用这个键来设置帧率..?

我还使用AVVideoMaxKeyFrameIntervalKey进行了一些实验,但这根本不会改变我的帧速率......

总而言之,任何人都可以帮我设置基于iOS AVFoundation的视频转换的不同(总是更低)输出帧速率吗?谢谢!

1 个答案:

答案 0 :(得分:1)

正如问题所述,我使用SDAVAssetExportSession来轻松导出视频。我对它进行了一些小改动,使我能够轻松地使用它来改变帧速率。

主要要点是,您可以使用AVMutableVideoComposition更改帧率,将frameDuration属性设置为所需的帧速率,并将此合成对象传递给转码中使用的AVAssetReaderVideoCompositionOutput对象。 / p>

在SDAVAssetExportSession的buildDefaultVideoComposition方法中,我修改它看起来有点像这样:

- (AVMutableVideoComposition *)buildDefaultVideoComposition
{
  AVMutableVideoComposition *videoComposition = [AVMutableVideoComposition videoComposition];
  AVAssetTrack *videoTrack = [[self.asset tracksWithMediaType:AVMediaTypeVideo] objectAtIndex:0];

  // ...

  videoComposition.frameDuration = CMTimeMake(1, myDesiredFramerate);

  // ...

这就是诀窍。