2012-06-18 75 views
6

我試圖同時讀寫由AVAssetWriter編寫的H.264 mov文件。我設法提取單獨的NAL單元,將它們打包到ffmpeg的AVPackets中,並使用ffmpeg將它們寫入另一個視頻格式。它的工作原理和結果文件播放良好,除了播放速度不正確。如何從原始H.264數據計算正確的PTS/DTS值?或者也許存在一些其他方式來獲得它們?從iOS生成的原始H264 mdat獲取PTS AVAssetWriter

這是我已經試過:

  1. 限制捕獲最小/最大幀速爲30,假定輸出文件將是每秒30幀。事實上,它的fps總是小於我設定的值。而且,我認爲fps在數據包與包之間並不是恆定的。

  2. 請記住每個書面樣本的呈現時間戳,並假定樣本一對一地映射到NALU並將保存的時間戳應用於輸出數據包。這不起作用。

  3. 將PTS設置爲0或AV_NOPTS_VALUE。不起作用。

從谷歌搜索瞭解它,我明白,原始的H.264數據通常不包含任何時間信息。它有時可以在SEI內部有一些時間信息,但是我使用的文件沒有它。另一方面,有一些應用程序正在做我正在嘗試做的事情,所以我認爲這是可能的。

+2

我也試圖從AVAssetWriter寫的mov文件中同時讀取H.264,並且無法使用管道/常規文件讀取來執行此操作。在寫作過程中,你是如何設法閱讀的?謝謝! –

+3

使用常規文件讀取,而不是在EOF上重新讀取。你的閱讀行動遲早會成功。 – kolyuchiy

+2

@kolyuchiy - 調度源更好地使用該系統。在FILE描述符上設置一個讀取源。當有數據需要讀取時,塊將被調用。如果發生EOF,請清除FILE上的錯誤。 –

回答

5

您將不得不自己生成它們,或訪問MP4/MOV容器中包含Atom的定時信息以生成PTS/DTS信息。 libmformat中的FFmpeg mov.c可能會有所幫助。

您使用AVAssetWriter編寫的每個樣本/框架都將與VCL NAL一一對應。如果你正在做的是轉換,然後FFmpeg做所有繁重的工作。從一種容器格式轉到另一種容器格式時,它將適當地維護時間信息。

由AVAssetWriter生成的比特流不包含SEI數據。它只包含SPS/PPS/I/P幀。 SPS也不包含VUI或HRD參數。

- 編輯 -

另外,請記住,如果你是從CMSampleBufferRef當時的時基保存PTS的信息可能是從該目標容器的不同。例如,AVFoundation時間基準爲毫微秒,而FLV文件爲毫秒。

+1

謝謝!實際上,CMSampleBuffers確實包含映射到輸出數據包的正確PTS。我只是懶得無法完成這個方向。這解決了我的問題。 – kolyuchiy