2017-02-22 86 views
0

我在av_interleaved_write_frame處理視頻和音頻數據包的方式中找不到任何信息。使用FFmpeg編寫多線程視頻和音頻數據包

我有來自2個線程的多個音頻和視頻數據包。每個線程調用write_video_framewrite_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

av_interleaved_write_frame以這種方式寫入輸出數據包,以便它們正確交織(可能在內部排隊)。 「正確交錯」取決於容器格式,但通常意味着輸出文件中數據包的DTS標記單調遞增。

av_interleaved_write_frame與大多數FFmpeg API一樣,不應該由具有相同AVFormatContext的兩個線程同時調用。我假設你用一個互斥體確保這一點。如果你這樣做,無論它是多線程應用還是現在都無關緊要。

是,如果我在一次寫入多個視頻數據包的問題(比如說25包/秒),只是一個音頻數據包/秒

這不是一般的問題,但大多數的音頻編解碼器不能輸出1秒長的音頻數據包。你使用哪種編解碼器?

在這種情況下,如何管理pts和dts?我可以爲視頻和音頻使用實時郵票嗎?

與在單線程應用程序中使用的方式相同。 Dts通常由來自pts的編解碼器生成。 Pts通常來自捕獲設備/解碼器以及相應的音頻/視頻數據。

實時郵票可能可以使用,但它確實取決於您如何以及何時獲得它們。請詳細說明你正在嘗試做什麼。音頻/視頻數據來自哪裏?

+0

我添加了一些關於視頻和音頻源的信息。我確實使用互斥體來保證線程安全,並且這項工作很好。正如我所提到的,我沒有對音頻使用任何壓縮,並且我捕獲了1秒的數據包,這意味着每秒鐘有176400字節的數據。這是太多的數據用於'av_interleaved_write_frame'嗎?如果是這樣,我該如何處理這種情況? –

+1

我明白了。通常'av_interleaved_write_frame'可以處理這種類型的數據包;也許AVI格式/複用器在這方面有一些限制?可能不會。關於時間戳 - 如果您使用例如捕獲A/V DirectShow然後它爲您提供時間戳,你應該使用它們作爲pts源代碼;只要確保它們具有相同的參考時間(即在同一時刻捕獲的樣本將具有相同的時間戳)。使用掛鐘時間可能會成爲一個問題,因爲除非得到補償,否則它會在時間戳中引起大量抖動。 –

+0

謝謝你的回答,這給了我一些想法,因爲我有時間戳捕獲哪些可以用於pts/dts。另一個問題是,當我將音頻捕獲爲原始數據時,我可以直接使用'av_interleaved_write_frame'還是必須使用PCM_S16LE對數據進行編碼,然後寫入數據? –