2013-10-14 16 views
6

Sto lavorando a un'implementazione di uno degli Android Test Cases riguardante la registrazione PreviewTexture con le nuove API MediaCodec e MediaMuxer di Android 4.3.Anteprima fotocamera muxing stream elementare codificato h264 con MediaMuxer

Sono riuscito a registrare il flusso di anteprima con un framerate di circa 30 fps impostando la voce di registrazione sui misuratori della fotocamera.

Tuttavia, ho riscontrato un problema di ritardo/ritardo e non so davvero come risolverlo. Quando si registra l'anteprima della fotocamera con impostazioni di qualità abbastanza standard (1280x720, bitrate di ~ 8.000.000) l'anteprima e il materiale codificato soffre di ritardi occasionali. Per essere più specifici: questo ritardo si verifica ogni 2-3 secondi e impiega circa 300-600 ms.

Tracciando il ritardo sono riuscito a capire il ritardo deriva dalla seguente riga di codice nel metodo "drainEncoder":

mMuxer.writeSampleData(mTrackIndex, encodedData, mBufferInfo); 

Questa linea è chiamata in un ciclo se l'encoder ha dati disponibili per il muxing. Attualmente non registro l'audio, quindi solo i flussi h264 vengono convertiti in un formato mp4 da MediaMuxer.

Non so se questo ha qualcosa a che fare con questo ritardo, ma si verifica sempre quando il ciclo ha bisogno di due iterazioni per annullare l'accodamento tutti i dati disponibili del codificatore (per essere ancora più specifico che si verifica sempre nella prima delle queste due iterazioni). Nella maggior parte dei casi è sufficiente un'iterazione per annullare l'eliminazione dell'encoder.

Poiché non ci sono molte informazioni online su queste nuove API, qualsiasi aiuto è molto apprezzato!

risposta

3

Ho il sospetto che tu sia stato morso dalla scrittura del disco MediaMuxer. Il modo migliore per essere sicuri è eseguire systrace durante la registrazione e vedere cosa sta effettivamente accadendo durante la pausa. (Systrace docs, explanation, bigflake example - che fin da oggi solo quest'ultima viene aggiornata per Android 4.3)

Se questo è il caso, si può essere in grado di mitigare il problema eseguendo l'istanza MediaMuxer su un thread separato, alimentazione i dati H.264 ad esso attraverso una coda sincronizzata.

Queste pause si verificano regolarmente ogni 5 secondi? L'esempio di CameraToMpegTest configura l'encoder per emettere un I-frame ogni 5 secondi (con una frequenza di fotogrammi prevista di 30 fps), il che si traduce in un fotogramma di dimensioni normali in uscita piuttosto che in minuscoli delta.

+0

Grazie mille per la risposta: - I ritardi si verificano abbastanza regolarmente ogni 5 secondi. Ma la frequenza non cambia quando cambio l'intervallo I-Frame. La migliore ipotesi è che l'intervallo I-Frame personalizzato venga ignorato dal mio codificatore (Nexus 4)? - Ho già iniziato a provare a separare il muxing in un thread separato ieri e questo sembra funzionare ... quindi andrò da quella parte, grazie per aver confermato! - Systrace il ritardo non appena ho abbastanza tempo – mAx

0

Come sottolinea @fadden, si tratta di un problema di scrittura su disco che si verifica principalmente su dispositivi con velocità di scrittura in flash inferiori o se si tenta di scrivere sulla scheda SD.

Ho scritto una soluzione su come tamponare la scrittura di MediaMuxer in una domanda simile here.

Problemi correlati