我在av_interleaved_write_frame
處理視頻和音頻數據包的方式中找不到任何信息。使用FFmpeg編寫多線程視頻和音頻數據包
我有來自2個線程的多個音頻和視頻數據包。每個線程調用write_video_frame
或write_audio_frame
,鎖定互斥鎖,初始化AVPacket並將數據寫入.avi文件。
AVCodecContext和AVFOrmatContext的初始化是可以的。
- 編輯1 -
音頻和視頻是從外部源(麥克風和攝像機)來,沒有任何壓縮被捕獲作爲原始數據(即使對於視頻)。 我使用h264來編碼視頻和音頻(PCM)沒有壓縮。
音頻捕獲的是:16位,44100khz,立體聲
視頻拍攝的是25FPS
問:
1)是不是,如果我在一次寫入多個視頻數據包的問題(假設25包/秒)和一個音頻包/秒。
答:顯然不是,功能av_interleaved_write_frame
應該能夠儘快PTS和DTS有良好的管理
這意味着我打電話av_interleaved_write_frame
25倍的視頻寫入,只是管理的那種數據1用於每秒寫入音頻。這可能是一個問題嗎?如果這是我該如何處理這種情況?
2)在這種情況下,我如何管理pts和dts?這似乎是我的應用程序中的問題,因爲我無法正確呈現.avi文件。我可以爲視頻和音頻使用實時郵票嗎?
答:在這裏做的最好的事情就是用捕獲音頻/視頻作爲PTS和DTS這種應用的時候給出的時間戳。所以這些並不是真正的時間戳(來自掛鐘),而是媒體捕獲時間戳。
謝謝你的寶貴意見。
我添加了一些關於視頻和音頻源的信息。我確實使用互斥體來保證線程安全,並且這項工作很好。正如我所提到的,我沒有對音頻使用任何壓縮,並且我捕獲了1秒的數據包,這意味着每秒鐘有176400字節的數據。這是太多的數據用於'av_interleaved_write_frame'嗎?如果是這樣,我該如何處理這種情況? –
我明白了。通常'av_interleaved_write_frame'可以處理這種類型的數據包;也許AVI格式/複用器在這方面有一些限制?可能不會。關於時間戳 - 如果您使用例如捕獲A/V DirectShow然後它爲您提供時間戳,你應該使用它們作爲pts源代碼;只要確保它們具有相同的參考時間(即在同一時刻捕獲的樣本將具有相同的時間戳)。使用掛鐘時間可能會成爲一個問題,因爲除非得到補償,否則它會在時間戳中引起大量抖動。 –
謝謝你的回答,這給了我一些想法,因爲我有時間戳捕獲哪些可以用於pts/dts。另一個問題是,當我將音頻捕獲爲原始數據時,我可以直接使用'av_interleaved_write_frame'還是必須使用PCM_S16LE對數據進行編碼,然後寫入數據? –