我有一个AVMutableVideoComposition
并且我想设置导出帧速率(例如 10 fps):
videoComposition.frameDuration = CMTimeMakeWithSeconds(1, 10);
我还有其他各种指令,例如对构图进行转换,它们都可以工作,但是,导出的视频只是忽略此属性并以原始视频的帧速率导出。
这是我的代码:
AVMutableVideoComposition *videoComposition = [AVMutableVideoComposition videoCompositionWithPropertiesOfAsset:asset];
...
videoComposition.frameDuration = CMTimeMakeWithSeconds(1, 10);
AVMutableVideoCompositionLayerInstruction *transformInstruction = [AVMutableVideoCompositionLayerInstruction videoCompositionLayerInstructionWithAssetTrack:videoTrack];
instruction.timeRange = videoTrack.timeRange;
[transformInstruction setTransform:matrix atTime:kCMTimeZero];
instruction.layerInstructions = @[ transformInstruction ];
videoComposition.instructions = @[ instruction ];
[[NSFileManager defaultManager] removeItemAtURL:exportURL error:nil];
AVAssetExportSession *exportSession = [AVAssetExportSession exportSessionWithAsset:asset presetName:AVAssetExportPresetHEVCHighestQuality];
exportSession.outputURL = exportURL;
exportSession.outputFileType = exportOptions.fileType;
exportSession.videoComposition = videoComposition;
exportSession.shouldOptimizeForNetworkUse = exportOptions.shouldOptimizeForNetworkUse;
[exportSession exportAsynchronouslyWithCompletionHandler:^{
//video is exported with all the settings correctly, except the frame rate.
}];
我也尝试过AVAssetExportPresetPassthrough
而不是AVAssetExportPresetHEVCHighestQuality
作为导出会话预设,但没有任何改变。
为什么会被frameDuration
忽略,以及如何在不使用其他 3rd 方库(例如SDAVAssetExportSession )的情况下使其工作?
我已经看到设置 AVMutableComposition 的 frameDuration但那里没有解决方案。但是,当我检查SDAVAssetExportSession
' 的源时,它frameDuration
就像我一样使用该属性(请参阅https://github.com/rs/SDAVAssetExportSession/blob/master/SDAVAssetExportSession.m#L308),但由于某种原因我的不是在职的。但既然这样有效,即使 Apple 的 AVKit 存在错误,也必须有一种解决方法。我错过了什么?