使用 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);
// ...
成功了。
我正在尝试使用可变帧速率和持续时间剪辑重新编码输入 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);
// ...
成功了。