2014-01-07 77 views
5

我試圖通過預覽獲取視頻原始數據,通過AudioRecord獲取音頻原始數據。然後我將它們發送給MediaCodec(我將設置兩個編解碼器實例)。之後,我會將視頻數據和音頻數據發送到MediaMux以獲得mp4文件。我有兩個問題:如何向MediaMux提供音頻數據和視頻數據

1)我已經使用過MediaMux處理視頻數據。對於視頻數據,MediaMux逐幀處理,但視頻記錄是連續的。 MediaMux如何能夠同步處理視頻和音頻。

2)我在函數writeSampleData中發現只有inputbuffer的變量。 StackOverflow上的一個好人也提供了一個MediaMux的演示。但是這個演示只對源數據有一個變量。這一個變量如何能夠同時支持視頻數據和音頻數據?

謝謝!

+0

對於18以下的api級別,你有什麼解決方案? –

+0

您可以使用FFmpeg。這是可能的,但我沒有嘗試。 –

回答

8

我已經有一些成功傳遞同步音頻和視頻到MediaMuxer。我計算了每幀視頻應播放的音頻採樣數量:基於音頻採樣率和視頻幀率。然後我有一個循環,在每次迭代中寫入一個視頻幀和一個音頻塊。使用演示時間以確保它們在播放時同步。使用addTrack中的軌道索引撥打writeSampleData,以允許將視頻和音頻寫入兩個單獨的軌道。

+0

謝謝!你能告訴我你如何處理音頻記錄?由於音頻記錄是不變的,你是否保持它的錄音或者你在幀之間停下來?我回顧了MediaMux API,但似乎我們使用addTrack來添加MediaFormat。如果我們想爲MediaMux提供音頻源和視頻源,該怎麼辦?另外,writeSampleData中只有一個變量用於inpurbuffer。 –

+0

我很早就錄製了錄製的視頻和音頻,所以我的場景與你的不同。我在'AsyncTask'中使用'AudioRecord'並假定你也這樣做。在幀之間停止錄音會產生口吃音頻,所以不理想。您需要仔細管理視頻和音頻錄製線程以獲得流暢的錄製 - 編寫/複用任務可能會佔用較低的優先級,因爲它們不會影響用戶體驗。調用'addTrack'一次以添加視頻軌道並再次添加音軌。它返回添加軌道的索引。然後爲每個軌道調用'writeSampleData'。 – lighty

+0

謝謝!所以我應該使用addTrack兩次並獲得兩個索引。然後我使用writeSampleData兩次,函數的第一個變量是indexI get,第二個是原始數據的源。是對的嗎? –

1

總計回答@ robin-royal,爲了編碼視頻和音頻y應該調用兩次MediaMuxer的Addtrack方法,一個軌道索引(int)給每一個。 因此,當您在MediaMuxer中調用WriteSampleData時,第一個參數指定了軌道索引e。 G。如果audioTrackIndex = 2和videoTrackIndex = 1,如果您用第一個參數等於1調用WriteSampleData,則您將寫入視頻。 (對不起,我沒有權利在評論中回答他) 謝謝