AVAssetWriter AVVideoExpectedSourceFrameRateKey(帧速率)被忽略

我和我的团队正在尝试通过更改video帧速率将video文件重新编码为更“gify”的感觉。 我们正在为AVAssetWriterInput使用以下属性:

 let videoSettings:[String:Any] = [ AVVideoCodecKey: AVVideoCodecH264, AVVideoHeightKey: videoTrack.naturalSize.height, AVVideoWidthKey: videoTrack.naturalSize.width, AVVideoCompressionPropertiesKey: [AVVideoExpectedSourceFrameRateKey: NSNumber(value: 12)] ] 

但输出video继续以正常帧速率播放(使用AVPlayer播放)。

什么是降低video帧率的正确方法? (例如12)。

任何朝着正确方向的帮助都会得到很好的认可。 我们卡住了。 最好的问候,Roi

您可以使用CMSampleBufferCreateCopyWithNewTiming直接控制附加到AVAssetWriterInput的每个样本的时间。

您需要调整您提供的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 } 

我在这段代码中做了一些假设:

  • SampleBuffer只包含一个样本
  • SampleBuffer包含未压缩的video(否则,您还需要处理decodeTimeStamp)