Avfoundation 帮助我理解AVAssetWriter中的CMTime

Avfoundation 帮助我理解AVAssetWriter中的CMTime,avfoundation,avassetwriter,Avfoundation,Avassetwriter,我很难理解如何使用AVAssetWriter将30fps的运动JPEG流转换为视频文件。我没有得到的部分是 [适配器appendPixelBuffer:BufferwithPresentationTimeResentTime]方法 如果要输出30fps mpeg4视频,如何计算withPresentationTime值 视频源是一台实时以30fps的速度传输JPEG运动的摄像机 谢谢你的建议 谢谢您需要使用CMTimeMake生成CMTime结构。每帧需要将时间增加1/30秒 这是一张草图: C

我很难理解如何使用AVAssetWriter将30fps的运动JPEG流转换为视频文件。我没有得到的部分是 [适配器appendPixelBuffer:BufferwithPresentationTimeResentTime]方法

如果要输出30fps mpeg4视频,如何计算withPresentationTime值

视频源是一台实时以30fps的速度传输JPEG运动的摄像机

谢谢你的建议


谢谢

您需要使用CMTimeMake生成CMTime结构。每帧需要将时间增加1/30秒

这是一张草图:

CMTime time = CMTimeMake(0, 30); // (time, time_scale)

for(each image) {
  [adaptor appendPixelBuffer:buffer withPresentationTime:time]
  time.value += 1; 
}
时间设置如图所示,最小时间分辨率为1/30秒。时间/时间刻度=1秒。我不确定H.264是否有具体要求。根据我的经验,AVFoundation在捕获时使用1000000000(1000000000或10亿)的时间刻度

更新:

只是回顾一下。从CMTime结构中:

CMTimeValue value;  /*! @field value The value of the CMTime. value/timescale = seconds. */
CMTimeScale timescale;  /*! @field timescale The timescale of the CMTime. value/timescale = seconds.  */
整个视频中的时基将保持不变。假设当前值为10,时间刻度为30。以秒为单位的当前时间为10/30=0.33333秒。电影第40帧的时间值为40/30=1.33333。因此,第40帧应该在电影开始后1.3333秒渲染


我不确定这个时基是否适合H.264视频。我不熟悉该规范。我知道在捕获视频时,视频帧的显示时间基数为100000000。从技术上讲,这不重要。时间是一个有理数——100000000/100000000=1秒,30/30=1秒。

嗨,史蒂夫,有几个问题。那么30的时间刻度在整个记录过程中保持不变?我将继续增加时间值1?感谢您的回复。谢谢,哇,史蒂夫。我脑子里的灯泡亮了。你补充的解释真的帮助我理解。顺便说一句,我只能得到15帧。如果我将时间刻度设置为30,我的视频将无法播放。而且,时间基准是1秒内有多少“时间步长”。你用什么时基让它工作?