Tho*_*mas 4 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;
Run Code Online (Sandbox Code Playgroud)
当写入/编码修改后的帧时:
CMTime myTime = CMTimeMake(frameInfo->frameTimeValue, frameInfo->frameTimeScale);
[pixelBufferAdapter appendPixelBuffer:pixelsBuffer withPresentationTime:myTime];
Run Code Online (Sandbox Code Playgroud)
有想法吗?时间刻度值似乎确实表明视频应以 29.97 fps 进行编码(其frameTimeValue 值为1001 和2002 等,frameTimeScale 为30000)。即使我手动将每帧的frameTimeValue增加1030而不是1001,它仍然将视频固定在30 fps。一旦我将其调至 1050 左右,我就会开始获得 28.75 左右的准确帧率或其他任何结果。
发现问题 - 在添加任何帧之前,您必须手动设置 AVAssetWriterInput 的时间刻度。否则,它假定的时间尺度可能与您要添加的帧的时间尺度不兼容,从而导致舍入错误并创建错误的帧速率。
assetWriterInputVideo.mediaTimeScale = 30000;
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
2077 次 |
最近记录: |