AVAssetWriter帧率略有下降

时间:2015-08-13 06:20:53

标签: macos video encoding avasset

我尝试使用OSX AVAsset类从电影文件中读取视频帧,调整颜色,然后将它们写入新的电影文件。我已经完成了所有工作,除非出于一些奇怪的原因,当我在一个以每秒29.97帧播放的视频中阅读时(根据Final Cut Pro X中的检查员),输出视频已列出因为每秒30帧甚至。除了其他问题之外,这种小差异使我无法在Final Cut项目中交换两个视频文件。

在进行写入/编码时,我使用了解码/输入帧的精确定时信息。这是以下相关代码。

读取/解码帧时:

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.97 fps编码(它的frameTimeValue值为1001和2002等,frameTimeScale为30000)。即使我为每帧而不是1001手动增加frameTimeValue 1030,它仍会将视频固定为30 fps。一旦我把它变成了1050,我开始得到一个像28.75那样的准确帧率或者它的功能。

1 个答案:

答案 0 :(得分:3)

发现问题 - 您必须在添加任何帧之前手动设置AVAssetWriterInput的时间刻度。否则,它会假设某些时间尺度可能与您添加的帧的时间尺度不兼容,从而导致舍入错误并产生错误的帧速率。

assetWriterInputVideo.mediaTimeScale = 30000;