我们正在尝试了解如何控制/指定我们使用AVAssetReader
和编码的视频的帧速率AVAssetWriter
。具体来说,我们正在使用AVAssetReader
和AVAssetWriter
转码/编码/压缩我们从照片/视频库访问的视频。我们能够控制比特率、纵横比变化等,但无法弄清楚如何控制帧率。具体来说,我们希望能够将 5 分钟长的 30 FPS 视频作为输入,并以 15 FPS 的速度发出 5 分钟的视频。
我们当前处理样本缓冲区的循环是:
[writer startWriting];
[writer startSessionAtSourceTime:kCMTimeZero];
[videoReader startReading];
[videoWriterInput requestMediaDataWhenReadyOnQueue:videoEncoderQueue usingBlock:
^{
while ([videoWriterInput isReadyForMoreMediaData]) {
CMSampleBufferRef sampleBuffer;
if ([videoReader status] == AVAssetReaderStatusReading
&& (sampleBuffer = [videoReaderTrackOutput copyNextSampleBuffer])) {
if (sampleBuffer) {
BOOL result = [videoWriterInput appendSampleBuffer:sampleBuffer];
CFRelease(sampleBuffer);
if (!result) {
[videoReader cancelReading];
break;
}
}
} else {
// deal with status other than AVAssetReaderStatusReading
[videoWriterInput markAsFinished];
// [...]
break;
}
}
}];
我们如何增加或改变这一点,以便我们可以控制所创建视频的帧速率?我们似乎无法在 SO 或其他任何地方找到明确解释如何执行此操作的示例。我认为我们应该使用CMTime
除上面代码示例中的方法之外的其他方法,但细节尚不清楚。