我试图导出视频与一些参数,如视频比特率,音频比特率,帧率,改变视频分辨率等。注意,我让用户设置视频帧速率的分数; 就像用户可以设置视频帧速率一样,比如23.98。
我使用 AVAssetWriter和 AVAssetReader执行这个操作。我使用 像素缓冲适配器编写示例缓冲区。
除了 视频帧速率视频帧速率,其他的都很好用。
我不确定为什么它不能与我的代码一起工作。这种方法的问题在于它总是从 CopNextSampleBuffer ()返回 null。
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) ,我如何决定丢弃哪个帧,如果目标帧速率更高,复制哪个帧?提示: 帧速率可以是分数。