2011-03-22 71 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