La classe MediaExtractorCompat è un sostituto diretto della classe MediaExtractor della piattaforma e fornisce API e funzionalità identiche. Facilita l'estrazione di dati multimediali demuxati, in genere codificati, da un'origine dati.
Separa un file contenitore (come MP4 o MKV) nelle sue singole tracce, come video, audio e sottotitoli codificati. L'estrattore legge quindi i dati grezzi, codificati da queste tracce come una sequenza di campioni (ad esempio, un singolo fotogramma video compresso o un blocco audio) prima che vengano inviati a un decoder.
I casi d'uso comuni includono:
- Transcodifica o remuxing: lettura di campioni codificati da una traccia per modificare il codec (transcodifica) o ricompattare i flussi in un nuovo contenitore (remuxing), ad esempio convertendo un file MP4 in MKV.
- Estrazione selettiva dei contenuti: isolamento e salvataggio di una singola traccia, ad esempio l'estrazione di uno stream audio da un file video.
- Debug di basso livello: ispezione di singoli campioni per eseguire il debug di file corrotti, problemi di timestamp o altri problemi.
- Creazione di player personalizzati: per casi d'uso di nicchia, crea un player personalizzato con il pieno controllo della pipeline multimediale.
Panoramica
Il seguente esempio di codice mostra come utilizzare MediaExtractorCompat:
Kotlin
fun extractSamples(context: Context, mediaPath: String) { val extractor = MediaExtractorCompat(context) try { // 1. Setup the extractor extractor.setDataSource(mediaPath) // Find and select available tracks for (i in 0 until extractor.trackCount) { val format = extractor.getTrackFormat(i) extractor.selectTrack(i) } // 2. Process samples val buffer = ByteBuffer.allocate(10 * 1024 * 1024) while (true) { // Read an encoded sample into the buffer. val bytesRead = extractor.readSampleData(buffer, 0) if (bytesRead < 0) break // Access sample metadata val trackIndex = extractor.sampleTrackIndex val presentationTimeUs = extractor.sampleTime val sampleSize = extractor.sampleSize extractor.advance() } } catch (e: IOException) { handleFailure(e) } finally { // 3. Release the extractor extractor.release() } }
Java
public void extractSamples(Context context, String mediaPath) { MediaExtractorCompat extractor = new MediaExtractorCompat(context); try { // 1. Setup the extractor extractor.setDataSource(mediaPath); // Find and select available tracks for (int i = 0; i < extractor.getTrackCount(); i++) { MediaFormat format = extractor.getTrackFormat(i); extractor.selectTrack(i); } // 2. Process samples ByteBuffer buffer = ByteBuffer.allocate(10 * 1024 * 1024); while (true) { // Read an encoded sample into the buffer. int bytesRead = extractor.readSampleData(buffer, 0); if (bytesRead < 0) { break; } // Access sample metadata int trackIndex = extractor.getSampleTrackIndex(); long presentationTimeUs = extractor.getSampleTime(); long sampleSize = extractor.getSampleSize(); extractor.advance(); } } catch (IOException e) { handleFailure(e); } finally { // 3. Release the extractor extractor.release(); } }