我们将从一个基本示例开始:假设我们有一个持续时间为6秒和30 FPS(总共180帧)的视频。我想在保持视频6秒的同时将FPS降低到15。意思是我需要从视频中删除/删除帧(6秒* 15 FPS = 90帧)。
我&我的团队可以使用AVAssetWriter
更改视频帧速率,但它只会使视频更长。我们试图在以下内容中跳过框架:
while(videoInput.isReadyForMoreMediaData){
let sample = assetReaderVideoOutput.copyNextSampleBuffer()
if (sample != nil){
if counter % 2 == 0 {
continue // skip frame
}
videoInput.append(sampleBufferToWrite!)
}
但它不起作用。即使我们跳过它,作者也会强制对初始样本进行计数。
底线,我们如何在保持相同持续时间的同时降低视频帧率(我们正试图创造一种GIFY视频感觉)?
非常感谢任何帮助!
最诚挚的问候,Roi
答案 0 :(得分:2)
对于每个丢弃的帧,您需要通过将要编写的样本的持续时间加倍来进行补偿。
while(videoInput.isReadyForMoreMediaData){
if let sample = assetReaderVideoOutput.copyNextSampleBuffer() {
if counter % 2 == 0 {
let timingInfo = UnsafeMutablePointer<CMSampleTimingInfo>.allocate(capacity: 1)
let newSample = UnsafeMutablePointer<CMSampleBuffer?>.allocate(capacity: 1)
// Should check call succeeded
CMSampleBufferGetSampleTimingInfo(sample, 0, timingInfo)
timingInfo.pointee.duration = CMTimeMultiply(timingInfo.pointee.duration, 2)
// Again, should check call succeeded
CMSampleBufferCreateCopyWithNewTiming(nil, sample, 1, timingInfo, newSample)
videoInput.append(newSample.pointee!)
}
counter = counter + 1
}
}