macos - AVAssetWriter 帧率略有下降

标签 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)。即使我手动将每帧的 frameTimeValue 增加 1030 而不是 1001,它仍然会将视频固定为 30 fps。一旦我将它调到 1050 左右,我就开始获得 28.75 左右的准确帧率或任何结果。

最佳答案

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

assetWriterInputVideo.mediaTimeScale = 30000;

关于macos - AVAssetWriter 帧率略有下降,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31980851/

相关文章:

c - 如何使用 execl ("/usr/bin/open"...) 重新启动 macOS 中的当前程序?

objective-c - 为什么在与 USB 转串行适配器通信时此串行通信代码会挂起?

video - 我如何将 css3 动画转换为视频?

c++ - 在弱光条件下性能更好(OpenCV)?

powershell - 使用 PowerShell 正确读取 UTF-8 文件

macos - "You have mail"消息在终端,os X

html - HTML5标签不起作用

c# - 从俄罗斯网站读取 XML 时的编码问题

c# - 在电子邮件中编码为 UTF-8

python - 如何通过 Python 脚本列出 Mac 上所有打开的窗口?