我试图在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的视频转换的不同(总是更低)输出帧速率吗?谢谢!
答案 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);
// ...
这就是诀窍。