2013-10-21 11 views
8

Ich codiere Camera Vorschau Daten mit MediaCodec mit Mime-Typ "Video/AVC" und die codierten Daten (nur Video, kein Audio) an MediaMuxer übergeben. Der Muxer scheint gut zu laufen und erstellt eine Ausgabedatei von einiger Größe (d. H. Wird größer, je länger ich aufnehme). Allerdings, wenn ich versuche, die muxer zu stoppen ich das bekommen „Fehler beim muxer zu stoppen“ Fehler:MediaMuxer-Fehler "Konnte den Muxer nicht stoppen"

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

Es gibt einige verdächtigen MPEG4Writer Protokollmeldungen den ausgefallenen Anschlag vorhergehenden:

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! 

Irgendwelche Hinweise, was verursacht das? Nicht sicher, welche weiteren Informationen Sie benötigen.

+0

Es sieht wie dein Muxer bereits beendet ist, wenn du versuchst, ihn zu stoppen. Sie müssen etwas Code für uns veröffentlichen, um Ihnen zu helfen. –

Antwort

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

Klingt wie Sie nicht MediaMuxer#addTrack() mit einem MediaFormat angerufen hat, die den CSD enthalten. Ein Beispiel dafür finden Sie im Code EncodeAndMuxTest.java.

Betrachtet man die MPEG4Writer implementation von MediaMuxer verwendet, gibt es eine isTrackMalformed() Check-Linie 2360; Es setzt ERROR_MALFORMED, wenn die CSD-Daten nicht vorhanden sind, aber nicht sofort zurückgegeben werden. Nichts löscht den Fehler, also macht es eine Menge Arbeit und scheitert dann, was dem entspricht, was Sie sehen.

+5

Ich bin auch auf dieses Problem gestoßen und möchte einige Erläuterungen hinzufügen: Um ein MediaFormat zu erstellen, das CSD (Codec Specific Data) enthält, müssen Sie dieses MediaFormat von einer vollständig konfigurierten Codec-Instanz über encoder.getOutputFormat beziehen. – Rakatan

+0

Rakatans Kommentar ist sehr nützlich. Versuchen Sie nicht, ein MediaFormat selbst zu erstellen. – Qylin

3

Ich hatte das gleiche Problem .Während des Schließens der Muxer war es "Fehler beim Stoppen" Fehler.Wenn ich meine gespeicherte Datei in einem ISO-Viewer überprüft habe ich konnte die Spur darin nicht finden. Ich löste Problem, indem die Spur zu schaffen erst nach der ersten Ausgabe aus dem Video bekommt encoder.Here ist, wie ich meine Spur hinzufügen

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

Das Medienformat für die Strecke von mediaCodec.getOutputFormat erhalten() der wiederum wird erst nach der Codierung der ersten Frame initialisiert.Ich habe meinen Code geändert, um die Spur nach dem ersten codierten Daten (Und natürlich nur einmal) hinzuzufügen. Es funktioniert gut.

+0

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

2

Es gibt 2 Probleme mit Android 5.0.2 Geräte Moto E 1) Die Höhe Breite & wenn nicht im Lieferumfang enthalten ein Vielfaches von 16 seiner 2) Die mediaBuffer Absturz eingestellt werden nach dem ersten Frame codiert