2011-03-22 62 views
2

我很难理解如何使用AVAssetWriter将30帧/秒的运动JPEG流转换为视频文件。我没有得到的部分是 [adapter appendPixelBuffer:buffer withPresentationTimeresentTime]方法。帮助我了解AVAssetWriter中的CMTime

如果我想输出30fps mpeg4视频,如何计算withPresentationTime值?

视频源是一个实时流式传输30fps动态JPEG的相机。

欣赏任何想法。

谢谢

回答

7

您将需要使用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秒。 time/time_scale = 1秒。我不确定H.264是否有特定的要求。 AVFoundation在捕捉时(按照我的经验)使用10亿次(10亿次或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. */ 

时基在整个视频中保持不变。假设您的时间刻度为30,当前值为10.当前时间(秒)为10/30 = 0.33333秒。电影第40帧的时间值是40/30 = 1.33333。所以第40帧应该在1.3333秒处进入电影。

我不确定这个时间基准是否适合H.264视频。我对规格不熟悉。我知道在拍摄视频时,视频帧的显示时间基准为10亿次。从技术上讲,这应该不重要。时间是一个合理的数字 - 1000000000/1000000000 = 1秒和30/30 = 1秒。

+0

嗨史蒂夫,有几个问题。那么30的time_scale在整个录制过程中会保持不变?我会不断增加1的时间值?感谢您的回应。谢谢。 – German 2011-04-01 16:39:32

+0

查看我的更新.. – 2011-04-01 18:56:18

+0

哇史蒂夫。一个灯泡在我的大脑中开启。你添加的解释确实有助于我理解。顺便说一句,我只能得到15fps。如果我将时间刻度设置为30,我的视频就不会播放。 – German 2011-04-01 19:40:15