我正在尝试导出具有某些参数的视频,例如视频比特率,音频比特率,帧频,更改视频分辨率等。请注意,我让用户以分数设置视频帧频;例如用户可以将视频帧频设置为23.98。
我使用 AVAssetWriter 和 AVAssetReader 进行此操作。我使用AVAssetWriterInputPixelBufferAdaptor编写示例缓冲区。
除视频帧速率外,其他所有功能都可以正常工作。
我不确定为什么它不能与我的代码一起使用。这种方法的问题在于,它总是从 AVAssetReaderVideoCompositionOutput.copyNextSampleBuffer()返回nil。
var sampleTimingInfo = CMSampleTimingInfo()
var sampleBufferToWrite: CMSampleBuffer?
CMSampleBufferGetSampleTimingInfo(vBuffer, at: 0, timingInfoOut: &sampleTimingInfo)
sampleTimingInfo.duration = CMTimeMake(value: 100, timescale: Int32(videoConfig.videoFrameRate * 100))
sampleTimingInfo.presentationTimeStamp = CMTimeAdd(previousPresentationTimeStamp, sampleTimingInfo.duration)
previousPresentationTimeStamp = sampleTimingInfo.presentationTimeStamp
let status = CMSampleBufferCreateCopyWithNewTiming(allocator: kCFAllocatorDefault, sampleBuffer: vBuffer,sampleTimingEntryCount: 1, sampleTimingArray: &sampleTimingInfo, sampleBufferOut: &sampleBufferToWrite)
通过这种方法,我的确设置了正确的帧频,但是却增加了视频时长(如该问题答案的评论中所述)。我认为在某些时候我可能不得不丢弃某些帧(如果目标帧速率较低;在大多数情况下,我需要降低帧速率)。
如果我知道是否要30fps,而我当前的帧速率是60fps,则很容易丢弃每隔一帧并相应地设置SampleBuffer时间。
如果我采用这种方法(即设置23.98 fps),如何确定要丢弃的帧以及目标帧速率是否较高,要复制的帧?提醒:帧速率可以是分数。