首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >AVAssetWriter帧速率略低

AVAssetWriter帧速率略低
EN

Stack Overflow用户
提问于 2015-08-13 14:20:53
回答 1查看 1.5K关注 0票数 4

我正在尝试使用OSX AVAsset类从电影文件中读入视频帧,调整颜色,然后将它们写出到一个新的电影文件中。我已经把所有的东西都处理好了,除了,由于一些奇怪的原因,当我读一段每秒29.97帧的视频时(根据Final Cut Pro X中的检查员),输出的视频甚至被列为每秒30帧。这个小差异,以及其他问题,使我不可能在最终剪切项目中交换这两个视频文件。

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

读取/解码帧时:

代码语言:javascript
复制
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;

当写入/编码修改的帧时:

代码语言:javascript
复制
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这样的精确帧率,或者任何它计算出来的。

EN

回答 1

Stack Overflow用户

发布于 2015-08-14 23:15:43

找到问题了-在添加任何帧之前,您必须手动设置AVAssetWriterInput的时间刻度。否则,它假设某个时间尺度可能与您要添加的帧的时间尺度不兼容,从而导致舍入误差和创建错误的帧速率。

代码语言:javascript
复制
assetWriterInputVideo.mediaTimeScale = 30000;
票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/31980851

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档