2013-12-09 21 views
5

Ho bisogno di decodificare un video in una sequenza di bitmap, in modo tale da essere in grado di modificarli e quindi comprimerli nuovamente in un file video in Android.Usa MediaCodec e MediaExtractor per decodificare e codificare video

Ho intenzione di gestirlo utilizzando getFrameAtTime e salvandolo in una sequenza di immagini. Quindi posso modificare le immagini nella sequenza e ricollegarla a un film. Ma ho due problemi con questo:

  • primo luogo, come ho letto, il getFrameAtTime è per la creazione di miniature e non garantirà la restituzione del frame corretto. Questo rende il video lento.
  • In secondo luogo, salvare le immagini e leggerle richiede molto tempo.

ho letto che il modo corretto di fare la decodifica è con MediaExtractor, questo va bene, ma ho solo esempi per renderlo direttamente a un surfaceView. C'è un modo per me di convertire lo outputBuffer in un bitmap?

Avrei bisogno di farlo funzionare con un livello API di 16 e superiore.

risposta

8

È possibile trovare una raccolta di esempi utili sul sito bigflake.

In particolare, il ExtractMpegFramesTest dimostra come decodificare un file .mp4 per Bitmap, e le DecodeEditEncodeTest decodifica e ri-codifica un flusso H.264, modificando i fotogrammi con uno shader GLES.

Molti degli esempi utilizzare funzionalità introdotte in API 18, come Surface input per MediaCodec (che evita una serie di questioni di colore-formato), e MediaMuxer (che permette di convertire il formato H.264 flusso elementare grezzo in uscita di MediaCodec in un file .mp4). Alcuni dispositivi ti consentiranno di estrarre video in dati YUV in ByteBuffer, modificarlo e ricodificarlo, ma altri dispositivi estraggono in formati di colore YUV proprietari che potrebbero essere rifiutati dalla versione API 16 di MediaCodec.

Si consiglia di codificare per API 18 (Android 4.3 "Jellybean" MR2) o successivo.

+0

Ebbene il problema è che ho già visto questo sito, ma purtroppo devo farlo per API lvl 16. E anche se dice che ExtractMpegFramesTest.java richiede l'API 16, quando provo a crearlo ne servono almeno 17 ... Quindi non è un'opzione. –

+0

Allora hai una battaglia in salita. Ha bisogno di lavorare in generale o è appena stato creato per un dispositivo specifico? (Verificherò in ExtractMpegFramesTest - Non pensavo ci fosse bisogno di qualcosa da 17+.) – fadden

+0

Beh, questo è il problema che deve essere generico e api lvl 16 + ... Ho ottenuto la soluzione getFrameAtTime per lavorare senza salvare su png e accellerarlo in questo modo un bel po 'di volte, ma ancora potrei avere il problema che estrarrà alcuni fotogrammi due volte, il che renderebbe il video lento e non ho ancora Idea come potrei aggiungere audio ad esso. Quindi qualsiasi suggerimento per dividere il video in bitmap e creare un nuovo file video con audio sarebbe apprezzato, ma deve funzionare con 16+ –

1

Ci sono molte persone che dicono che il metodo onFrameAvailable() non viene mai chiamato. Bene, l'ascoltatore dovrebbe trovarsi in un thread diverso rispetto al thread principale. Per impostare l'ascoltatore fare questo: (dove questo è l'ascoltatore classe che implementa SurfaceTexture.IOnFrameAvailableListener):

mSurfaceTexture.SetOnFrameAvailableListener(this); 
Problemi correlati