2016-06-08 130 views
1

我試圖使用Android的MediaMuxer和MediaCodec來製作MP4視頻。當批量寫入樣本時,Mediamuxer產生損壞的視頻

如果我通過調用writeSampleData()將編解碼器中的幀直接排到複用器,那麼一切正常,併產生正確的視頻。

但是,如果我嘗試先將這些幀存儲在一個數組上,並稍後決定將它們發送到複用器,則即使演示時間戳正確,我也無法生成工作視頻。

出於某種原因,mediamuxer輸出似乎不僅取決於呈現時間戳,而且還取決於調用實際時間「writeSampleData」,儘管我的理解是擁有正確的時間戳應該足夠了。

任何人都可以解釋一下這個問題?

+0

有關將視頻幀存儲在內存中並稍後寫出的示例,請參閱Grafika的「連續捕獲」活動 - https://github.com/google/grafika。你保存旗幟嗎? – fadden

+0

我在自定義對象上組合了所需的信息(bytebuffer,trackId和bufferInfo +標誌)。該對象通過隊列發送到複用器。如果從隊列中提取並立即寫入複用器,它就可以工作。如果我再次將這些對象存儲在數組中,並稍後繼續使用writeSampleData,則會失敗。我會看看grafika的代碼。 – Martelli

+0

你是否發送所有的幀?第一幀是同步幀嗎?接下來要做的是在「立即」和「延遲」模式下運行它,然後比較輸出的十六進制轉儲,看看是否有明顯的差異。 (理想情況下,使用固定源,例如GLES輸出,或者只有兩個MediaMuxer,並且兩次發送相同的數據,一次立即並延遲一次。)觀察MediaMuxer中logcat中只出現「延遲」模式的投訴。 – fadden

回答

2

謝謝mstorsjofadden。實際上,我遇到了一些錯誤,這些錯誤並不能讓我理解到底發生了什麼。你的問題都讓我知道了正確的代碼,並確信使用writeSampleData()是而不是時間敏感。

是的,我第一次弄錯了緩衝區。問題最初並不明顯,因爲在重寫緩衝區之前,複用器正在寫入幀。當我介紹延遲並決定複製緩衝區內容時,我遇到了另一個問題(基本上是一種競爭條件),並得出結論並非如此。

此代碼的作用(對於SmartPolicing項目)是捕獲視頻和音頻以創建MP4文件。我可以使用MediaRecorder(這是最初的解決方案),但我們也想攔截幀並通過網絡傳輸視頻,所以我們放下了MediaRecorder並創建了一個自定義解決方案。

現在它運行平穩。非常感謝,夥計們。

0

您確定實際上存儲了要寫入的幀的完整數據,而不僅僅是緩衝區索引嗎?

+0

是的。我甚至重複了一個新的字節[],並將其封裝爲一個字節緩衝區。 – Martelli

相關問題