0

我有一个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 存在错误,也必须有一种解决方法。我错过了什么?

4

0 回答 0