2013-10-21 18 views
8

MediaCodec mime tipi "video/avc" kullanarak Camera önizleme verilerini kodluyorum ve kodlanmış veriyi (yalnızca video, ses yok) MediaMuxer'a geçiriyorum. Muxer iyi çalışıyor ve makul boyutta bir çıktı dosyası yaratıyor (yani, daha uzun kayıt oldum). Ben muxer durdurmaya çalışırken Ancak, ben hata "muxer'i durdurulamadı" olsun:MediaMuxer hatası "Muxer'ı durdurulamadı"

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

başarısız durdurma önceki bazı şüpheli MPEG4Writer günlüğü mesajı vardır:

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! 

Herhangi ipuçları neler buna neden oluyor? Ne daha fazla bilgi ihtiyacınız olacak emin değilim. Eğer CSD dahil MediaFormat ile MediaMuxer#addTrack() aramadım gibi

+0

kodlanmış sonra 16 değil verilen katları onun ayarlanacak) mediaBuffer 2 kilitleniyor eğer Genişliği & yükseklik durdurmayı denediğinizde muxeriniz bitti. Size yardımcı olması için bir kod göndermeniz gerekecek. –

cevap

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

geliyor. Bunun nasıl yapılacağına ilişkin bir örnek için EncodeAndMuxTest.java koduna bakın.

MediaMuxer tarafından kullanılan MPEG4Writer implementation'a baktığımızda, bir isTrackMalformed() kontrol hattında 2360; CSD verileri yoksa ERROR_MALFORMED'u ayarlar, ancak hemen geri dönmez. Hiçbir şey hatayı temizlemez, bu yüzden bir grup iş yapar ve sonra da gördüğünüzle eşleşecek şekilde başarısız olur.

+5

Bu sorunla da karşılaştım ve bazı açıklamalar eklemek istiyorum: CSD (Codec Specific Data) içeren bir MediaFormat oluşturmak için, MediaFormat'ı kodlanmış bir codec örneğinden enkoder.getOutputFormat yoluyla edinmelisiniz. – Rakatan

+0

Rakatan'ın yorumu çok faydalı. Kendiniz MediaFormat oluşturmaya çalışmayın. – Qylin

3

Aynı sorunu yaşadım. Muxer'ı kapatırken "Durdurulamadı" hatası veriyordu. Kaydedilmiş dosyamı bir ISO görüntüleyicide işaretlediğimde, Track'i bulamadım. Ben encoder.Here ben parça için medya formatı mediaCodec.getOutputFormat() elde edilir

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

benim parça eklemek nasıl sadece videodan ilk çıkışını aldıktan sonra parçayı oluşturarak sorunu çözüldü hangi sırayla sadece ilk kareyi kodladıktan sonra başlatılır. İlk kodlanmış verileri aldıktan sonra parçayı eklemek için kodumu değiştirdim (Ve tabi ki sadece bir kez) .Bu iyi çalışıyor.

+0

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

2

Android ile 2 Sorunlar var 5.0.2 Cihazlar Moto E 1) İlk Kare görünüyor