使用AVAssetWriter在保持相同长度/持续时间的同时降低视频帧速率

时间:2018-03-13 01:20:44

标签: ios swift avfoundation video-processing avassetwriter

我们将从一个基本示例开始:假设我们有一个持续时间为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

1 个答案:

答案 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
  }
}