簡體   English   中英

從iOS AVAssetWriter生成的原始H264 mdat獲取PTS

[英]Get PTS from raw H264 mdat generated by iOS AVAssetWriter

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

這是我嘗試過的:

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

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

  3. 將PTS設置為0或AV_NOPTS_VALUE。 不行。

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

您必須自己生成它們,或者訪問包含MP4 / MOV容器中的定時信息的Atom,以生成PTS / DTS信息。 在libavformat中FFmpeg的mov.c可能有所幫助。

使用AVAssetWriter編寫的每個樣本/幀將與VCL NAL一對一映射。 如果您所做的只是轉換,那么讓FFmpeg做所有繁重的工作。 當從一種容器格式轉換到另一種容器格式時,它將正確地保持定時信息。

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

- 編輯 -

另外,請記住,如果要從CMSampleBufferRef中保存PTS信息,則時基可能與目標容器的時基不同。 例如,AVFoundation時基是納秒,FLV文件是毫秒。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM