2013-10-21 13 views
8

sto codifica Camera dati di anteprima utilizzando MediaCodec con mime-type "di video/AVC" e passando i dati codificati (solo video, senza audio) per MediaMuxer. Il muxer sembra funzionare bene e crea un file di output di dimensioni ragionevoli (ad esempio, diventa più grande il record I più lungo). Tuttavia, quando cerco di fermare il muxer mi vengono i "è riuscito a fermare il muxer" Errore:errore MediaMuxer "Impossibile fermare il muxer"

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

Ci sono alcuni messaggi di log MPEG4Writer sospetti che precedono l'arresto fallito:

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! 

Degli indizi che cosa sta causando questo? Non sei sicuro di quali ulteriori informazioni avrai bisogno.

+0

Sembra come il tuo muxer è già finito quando provi a fermarlo. Dovrai pubblicare un codice per noi per aiutarti. –

risposta

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

Suona come non hai chiamato MediaMuxer#addTrack() con un MediaFormat che comprendeva il CSD. Vedere il codice EncodeAndMuxTest.java per un esempio di come farlo.

Guardando allo MPEG4Writer implementation utilizzato da MediaMuxer, c'è un controllo isTrackMalformed() sulla linea 2360; imposta ERROR_MALFORMED se i dati CSD non sono presenti, ma non restituiscono immediatamente. Niente cancella l'errore, quindi farà un sacco di lavoro e poi fallirà, il che sembra corrispondere a quello che stai vedendo.

+5

Ho riscontrato questo problema e vorrei aggiungere qualche chiarimento: Per creare un MediaFormat che include CSD (Dati specifici del codec), è necessario ottenere detto MediaFormat da un'istanza del codec completamente configurata tramite encoder.getOutputFormat. – Rakatan

+0

Il commento di Rakatan è molto utile. Non provare a creare un MediaFormat da solo. – Qylin

3

Ho avuto lo stesso problema. Mentre chiudevo il Muxer stava lanciando l'errore "Failed to stop". Quando ho controllato il mio file salvato in un visualizzatore ISO non riuscivo a trovare la traccia in esso. Ho risolto problema creando la pista solo dopo aver ottenuto la prima uscita dal video encoder.Here è come aggiungo la mia pista

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

Il formato multimediale per la traccia è ottenuto da mediaCodec.getOutputFormat() che a turno verrà inizializzato solo dopo la codifica del primo frame. Ho cambiato il mio codice per aggiungere la traccia dopo aver ottenuto i primi dati codificati (e ovviamente solo una volta). Funziona bene.

+0

se (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

Ci sono 2 problemi con Android 5.0.2 Dispositivi Moto E 1) L'altezza Larghezza & se i multipli non forniti di 16 il suo crash 2) La mediaBuffer da impostare dopo il primo fotogramma è codificato

Problemi correlati