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

Using AVAssetWriter to re-encode H264 mov file - how to set frame-rate?

我正在尝试使用可变帧速率和持续时间剪辑重新编码输入 MOV 文件,iOS。目前我有一个 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 的视频转换设置不同的(总是较低的)输出帧率吗?谢谢!

如问题中所述,我使用SDAVAssetExportSession方便视频导出。我对它做了一些小改动,使我能够轻松地使用它来更改帧率。

要点是您可以使用 AVMutableVideoComposition 更改帧率,将 frameDuration 属性 设置为您想要的帧率,并将此合成对象传递给 AVAssetReaderVideoCompositionOutput 对象用于转码。

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

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

  // ...

  videoComposition.frameDuration = CMTimeMake(1, myDesiredFramerate);

  // ...

成功了。