2016-11-16 106 views
1

我正在嘗試解決A/V同步問題。視頻將比音頻延遲1秒。 (見我的音符下請)Android錄音和結果有音頻視頻同步問題

從Android的媒體框架的一部分, 我能不能延遲音頻時間戳,讓它與視頻同步,我應該從哪裏開始呢?它是AudioSource嗎? MPEG4Writer? MediaCodecSource?

請幫忙!!

[案例是]:如果有5秒的視頻。目前的情況:

視頻部分 0-1秒會凍結,1-5秒保持正常。視頻幀從1.00s開始實際上是從0.00s開始的幀。

音頻部分在整個場景中保持正常。所以視頻部分將延遲1秒,並帶有音頻部分。

1.00s上的視頻部分實際上與0.00s上的音頻部分匹配。

[失敗嘗試]

我試試,如果我只是繼續前進視頻部分的StartTimeUs上MPEG4Writer時,A/V將同步,但在文件末尾,會有1.00S與視頻凍結,和正常的音頻。

[MyThought]

如果我可以暫停音頻1秒,這將音頻0.00S移動到1.00S,它將同步。但我不知道這個方法可以改變的代碼。請幫忙!

My Notes

+0

您需要單獨錄製語音和視頻。對於音頻錄製,您需要使用OpenGLE。對於沒有語音的視頻錄製,您可以使用Camera類和Surfaceview。然後混合其中兩個。 –

回答

0

我開始與你使用的是MediaCodec編碼器和餵養輸出到MediaMuxer產生的視頻文件的假設。

聽起來這可能與我在this question中遇到的類似問題有關。我相信一個音頻MediaCodec編碼器本質上會忽略你投射的任何時間戳;所以我不認爲改變音頻時間戳可以解決你的問題。然而,聽起來好像你可以通過在幀離開編碼器之後但在到達複用器之前將視頻幀時間戳更早地(與音頻同步)解決問題。

+0

我已經更新了這個問題。情況是視頻將總是1秒延遲與音頻。我試圖在MPEG4Writer上將Video StartTimeUs更改爲1秒。它會同步到File的最後1秒。我有凍結的視頻,但正常的音頻...幫助〜 – user2871337

+0

你能分享代碼「更正視頻幀時間戳在更早的時間」假設視頻比音頻延遲1秒。 – user2871337

+0

在我的情況下,視頻幀被繪製到一個Surface上,作爲MediaCodec視頻編碼器的輸入。所以我的代碼在新設備上使用了一對Surface.lockCanvas()(或lockHardwareCanvas())和Surface.unlockCanvasAndPost()。由於解鎖方法不允許傳遞時間戳,因此每次調用MediaMuxer.writeSampleData()時,我都會在BufferInfo中手動輸入時間戳。 – nyttimangus