2013-10-21 118 views
8

我正在編碼Camera使用MediaCodec與mime類型「video/avc」並將編碼數據(僅限視頻,無音頻)傳遞到MediaMuxer的預覽數據。該複用器似乎運行良好,並創建一個合理大小的輸出文件(即,我記錄的時間越長越大)。然而,當我試圖阻止合併器我得到「無法停止合併器」錯誤:MediaMuxer錯誤「無法停止複用器」

10-21 10:39:40.755: E/AndroidRuntime(2166): Caused by: java.lang.IllegalStateException: Failed to stop the muxer 

有失敗的停止之前的一些可疑的MPEG4Writer日誌消息:

10-21 10:39:40.740: D/MPEG4Writer(2166): Stopping Video track 
10-21 10:39:40.740: E/MPEG4Writer(2166): Missing codec specific data 
10-21 10:39:40.740: W/MPEG4Writer(2166): 0-duration samples found: 122 
10-21 10:39:40.740: I/MPEG4Writer(2166): Received total/0-length (123/1) buffers and encoded 123 frames. - video 
10-21 10:39:40.740: D/MPEG4Writer(2166): Stopping Video track source 
10-21 10:39:40.740: D/MPEG4Writer(2166): Video track stopped 
10-21 10:39:40.740: D/MPEG4Writer(2166): Stopping writer thread 
10-21 10:39:40.740: D/MPEG4Writer(2166): 0 chunks are written in the last batch 
10-21 10:39:40.740: D/MPEG4Writer(2166): Writer thread stopped 
10-21 10:39:40.740: E/MPEG4Writer(2166): writer error ended! 

任何線索是什麼是造成這個?不知道你需要更多的信息。

+0

它看起來後就像你的MUXER已經結束了,當你試圖阻止它。你需要發佈一些代碼給我們來幫助你。 –

回答

12
E/MPEG4Writer(2166): Missing codec specific data 

聽起來像是你沒叫MediaMuxer#addTrack()MediaFormat,包括可持續發展委員會。有關如何執行此操作的示例,請參閱EncodeAndMuxTest.java代碼。

看使用MPEG4Writer implementation,有一個isTrackMalformed()檢查行2360;它設置ERROR_MALFORMED如果CSD數據不存在,但不立即返回。沒有任何東西可以清除錯誤,所以它會完成一些工作,然後失敗,這似乎與您所看到的相符。

+5

我也遇到過這個問題,希望補充一些說明: 爲了創建包含CSD(編解碼器特定數據)的MediaFormat,您必須通過encoder.getOutputFormat從完全配置的編解碼器實例中獲取所述MediaFormat。 – Rakatan

+0

Rakatan的評論是非常有用的。不要試圖自己構建MediaFormat。 – Qylin

3

我有同樣的問題。關閉Muxer時,它拋出「無法停止」錯誤。當我在ISO查看器中查看保存的文件時,找不到跟蹤。 我解決了問題,通過創建軌道僅從視頻獲得第一輸出後encoder.Here是我怎麼加我的軌道

m_VideoTrackIndex = muxer.addTrack(mediaCodec.getOutputFormat()); 

從 mediaCodec.getOutputFormat() 獲得的軌道的媒體格式,反過來,只有在編碼第一幀後纔會初始化。我改變了我的代碼,在獲得第一個編碼數據後添加音軌(當然只有一次)。它工作正常。

+0

如果(encoderStatus = MediaCodec.INFO_OUTPUT_FORMAT_CHANGED){ \t \t \t \t \t MediaFormat newFormat = mEncoder.getOutputFormat(); \t \t \t \t \t mTrackIndex = mMuxer.addTrack(newFormat); \t \t \t \t \t mMuxer.start(); – surya

2

有與Android兩個問題5.0.2設備摩托ë 1)寬&高度,如果16未提供其倍數崩潰 2)mediaBuffer要設置的第一幀編碼