2011-08-25 73 views
7

好的,這是實際情況,我真的想從mov文件中解析幀。獲得編碼的h264幀。我已經設法通過使用ffmpeg來做到這一點,但是當我嘗試使用ffmpeg -i test* test.mov再次製作電影時,我得到了test00: Invalid data found when processing input,所以對於幀的結構有些不正確。據我所知的幀應具有以下外觀:將.mov文件轉換爲.h264文件

00 00 00 01 XX數據-------------

其中XX是說是否是I-, P-或B-幀。或更具體地說type(XX) = 0x0F && XX表示如果它是I(type(XX)= 5?),P(type(XX)= 7?)或B(type(XX)= 8?)幀。我不確定這些數字,我一直在尋找它,但沒有找到好的來源。所以這是第一個問題,NALU應該爲不同的幀編號?

無論如何,當我使用av_read_frame在MOV文件,我得到幀看起來像這樣:

4B =大小,1B = XX,然後數據。 (至少這是我認爲我得到的)

我存儲幀的文件總是大小當我在hexeditor中查看它們時(當然也是如此)。並且對於一些幀,XX在第一個然後是61(即,類型(XX)= 1)中總是65(即,類型(XX)= 5),然後回到對於一個幀爲65等等。

我想這些幀是這樣的:I P P P P P P P P P P P P P P P P P P P P P ....然而,我關於不同幀類型的數字的假設是錯誤的,這很可能。 (除了ISO/IEC 14496-10之外,關於這方面的任何建議,我都不明白)。

我試圖刪除大小並在XX字節和數據之前追加00 00 00 01,但沒有成功。任何提示如何我可以修改幀是有效的H264編碼幀?

回答

5

首先,我要推薦一個很好的工具,瞭解H264流:http://sourceforge.net/projects/h264bitstream/

沒有,回答您的具體問題,是的,幀通常以65和61的特殊NAL單元,通常做起其中67和68分別是SPS(序列參數集)和PPS(圖片參數集)。

我還建議您嘗試使用ffmpeg -i input.mov -vcodec copy output.h264將附件B流(00 00 00 01)正確地作爲單個文件。

我無法準確理解,你試圖通過從mov中提取幀並將它們放入test.mov中來實現。

+1

+1。另外,我認爲可能需要'-vbsf h264_mp4toannexb'選項來提取實際的附件B流。 – misha

+1

感謝Alex和@misha的迴應。我意識到這個解決方案,但事情是我不能在提示中做到這一點,因爲我在iphone上進行實際的幀提取,我需要一種方法在代碼中完成這一操作。任何建議從哪裏開始?這樣做的原因是因爲我需要通過Web服務器將h264幀流式傳輸到外部框架以進一步處理幀。 –

+0

從ffmpeg源開始。這一切都讓你看到。 – misha