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

Ios 使用AVAssetWriter在保持相同长度/持续时间的同时降低视频帧速率,ios,swift,avfoundation,video-processing,avassetwriter,Ios,Swift,Avfoundation,Video Processing,Avassetwriter,我们将从一个基本示例开始:假设我们有一个持续时间为6秒30帧(总共180帧)的视频。我想将FPS降低到15,同时保持视频6秒。这意味着我需要从视频中删除/删除帧(6秒*15帧=90帧) 我和我的团队能够使用AVAssetWriter更改视频帧速率,但这只会使视频变长。我们尝试跳过以下内容中的帧: while(videoInput.isReadyForMoreMediaData){ let sample = assetReaderVideoOutput.copyNextSamp

我们将从一个基本示例开始:假设我们有一个持续时间为6秒30帧(总共180帧)的视频。我想将FPS降低到15,同时保持视频6秒。这意味着我需要从视频中删除/删除帧(6秒*15帧=90帧)

我和我的团队能够使用
AVAssetWriter
更改视频帧速率,但这只会使视频变长。我们尝试跳过以下内容中的帧:

while(videoInput.isReadyForMoreMediaData){
          let sample = assetReaderVideoOutput.copyNextSampleBuffer()
          if (sample != nil){
             if counter % 2 == 0 {
                  continue // skip frame
              }
          videoInput.append(sampleBufferToWrite!)
} 
但它不起作用。编写器强制执行初始样本计数,即使我们跳过它

总之,我们如何在保持相同的持续时间的同时降低视频帧速率(我们正在尝试创造一种美妙的视频感觉)?

任何帮助都将不胜感激


致以最诚挚的问候,Roi

对于每个丢弃的帧,您需要通过将要编写的示例的持续时间加倍来进行补偿

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
  }
} 
while(videoInput.isReadyForMoreMediaData){
如果let sample=assetradervideooutput.copyNextSampleBuffer(){
如果计数器%2==0{
让timingInfo=UnsafeMutablePointer.allocate(容量:1)
let newSample=unsafemeutablepointer.allocate(容量:1)
//检查呼叫是否成功
CMSampleBufferGetSampleTimingInfo(示例,0,timingInfo)
timingInfo.pointee.duration=CMTimeMultiply(timingInfo.pointee.duration,2)
//同样,检查调用是否成功
CMSampleBufferCreateCopyWithNewTimeing(无,示例,1,计时信息,新闻示例)
videoInput.append(newSample.pointee!)
}
计数器=计数器+1
}
} 

对于每个丢弃的帧,您需要通过将要编写的示例的持续时间加倍来进行补偿

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
  }
} 
while(videoInput.isReadyForMoreMediaData){
如果let sample=assetradervideooutput.copyNextSampleBuffer(){
如果计数器%2==0{
让timingInfo=UnsafeMutablePointer.allocate(容量:1)
let newSample=unsafemeutablepointer.allocate(容量:1)
//检查呼叫是否成功
CMSampleBufferGetSampleTimingInfo(示例,0,timingInfo)
timingInfo.pointee.duration=CMTimeMultiply(timingInfo.pointee.duration,2)
//同样,检查调用是否成功
CMSampleBufferCreateCopyWithNewTimeing(无,示例,1,计时信息,新闻示例)
videoInput.append(newSample.pointee!)
}
计数器=计数器+1
}
} 

嘿,缬草!非常感谢你,你不知道我们多么感谢你的帮助!我们又发现了一个(也是最后一个)阻碍我们前进的问题。我不确定这是否可以解决,但以防万一:我很想听听你的想法。谢谢你,缬草!嗨,缬草!非常感谢你,你不知道我们多么感谢你的帮助!我们又发现了一个(也是最后一个)阻碍我们前进的问题。我不确定这是否可以解决,但以防万一:我很想听听你的想法。谢谢你,缬草!