我和我的团队正在尝试通过更改视频帧速率将视频文件重新编码为更“gify”的感觉。我们对AVAssetWriterInput
使用以下属性:
let videoSettings:[String:Any] = [
AVVideoCodecKey: AVVideoCodecH264,
AVVideoHeightKey: videoTrack.naturalSize.height,
AVVideoWidthKey: videoTrack.naturalSize.width,
AVVideoCompressionPropertiesKey: [AVVideoExpectedSourceFrameRateKey: NSNumber(value: 12)]
]
但输出视频继续以正常帧速率播放(使用AVPlayer
播放)。
降低视频帧率的正确方法是什么? (例如12)。
任何正确方向的帮助都会被高度重视。我们卡住了。 最好的祝福, ROI
答案 0 :(得分:2)
您可以使用AVAssetWriterInput
直接控制附加到CMSampleBufferCreateCopyWithNewTiming
的每个样本的时间。
您需要调整所提供的CMSampleTimingInfo
中的时间。
使用CMSampleBufferGetOutputSampleTimingInfoArray
检索当前时序信息,然后查看每个采样的持续时间并计算正确的持续时间以获得每秒12帧,并调整显示和解码时间戳以匹配此新持续时间。
然后,您可以复制并将其提供给作者的输入。
假设你有existingSampleBuffer
:
CMSampleBufferRef sampleBufferToWrite = NULL;
CMSampleTimingInfo sampleTimingInfo = {0};
CMSampleBufferGetSampleTimingInfo(existingSampleBuffer, 0, &sampleTimingInfo);
// modify duration & presentationTimeStamp
sampleTimingInfo.duration = CMTimeMake(1, 12) // or whatever frame rate you desire
sampleTimingInfo.presentationTimeStamp = CMTimeAdd(previousPresentationTimeStamp, sampleTimingInfo.duration);
previousPresentationTimeStamp = sampleTimingInfo.presentationTimeStamp; // should be initialised before passing here the first time
OSStatus status = CMSampleBufferCreateCopyWithNewTiming(kCFAllocatorDefault, existingSampleBuffer, 1, &sampleTimingInfo, &sampleBufferToWrite);
if (status == noErr) {
// you can write sampleBufferToWrite
}
我在这段代码中做了一些假设: