我正在尝试使用OSX AVAsset类从电影文件中读入视频帧,调整颜色,然后将它们写出到一个新的电影文件中。我已经把所有的东西都处理好了,除了,由于一些奇怪的原因,当我读一段每秒29.97帧的视频时(根据Final Cut Pro X中的检查员),输出的视频甚至被列为每秒30帧。这个小差异,以及其他问题,使我不可能在最终剪切项目中交换这两个视频文件。
在进行写入/编码时,我使用来自解码/输入帧的精确定时信息。下面是相关的代码。
读取/解码帧时:
CMSampleBufferRef videoSampleBuffer = [assetReaderVideoOutput copyNextSampleBuffer];
if (videoSampleBuffer == NULL)
return false;
CMSampleTimingInfo myTiming;
CMSampleBufferGetSampleTimingInfo(videoSampleBuffer, 0, &myTiming);
frameInfo->frameTimeValue = myTiming.presentationTimeStamp.value;
frameInfo->frameTimeScale = myTiming.presentationTimeStamp.timescale;当写入/编码修改的帧时:
CMTime myTime = CMTimeMake(frameInfo->frameTimeValue, frameInfo->frameTimeScale);
[pixelBufferAdapter appendPixelBuffer:pixelsBuffer withPresentationTime:myTime]; 想法?时间比例值似乎表明视频应该以29.97fps进行编码(它的frameTimeValue值为1001和2002fps,frameTimeScale为30000)。即使我手动将每帧的frameTimeValue增加1030,而不是1001,它仍然将视频固定到30fps。一旦我把它调到1050左右,我就开始得到像28.75这样的精确帧率,或者任何它计算出来的。
发布于 2015-08-14 23:15:43
找到问题了-在添加任何帧之前,您必须手动设置AVAssetWriterInput的时间刻度。否则,它假设某个时间尺度可能与您要添加的帧的时间尺度不兼容,从而导致舍入误差和创建错误的帧速率。
assetWriterInputVideo.mediaTimeScale = 30000;https://stackoverflow.com/questions/31980851
复制相似问题