A classe MediaExtractorCompat é uma substituição direta da classe MediaExtractor da plataforma e oferece APIs e funcionalidades idênticas. Ele facilita a extração de dados de mídia demuxados, geralmente codificados, de uma fonte de dados.
Ele separa um arquivo de contêiner (como MP4 ou MKV) em faixas individuais, como vídeo, áudio e legendas. Em seguida, o extrator lê os dados codificados brutos dessas faixas como uma sequência de amostras (por exemplo, um único frame de vídeo compactado ou um bloco de áudio) antes de serem enviados a um decodificador.
Os casos de uso comuns incluem:
- Transcodificação ou remuxagem: leitura de amostras codificadas de uma faixa para mudar o codec (transcodificação) ou reempacotar os fluxos em um novo contêiner (remuxagem), como converter um arquivo MP4 para MKV.
- Extração seletiva de conteúdo: isolar e salvar uma única faixa, como extrair um stream de áudio de um arquivo de vídeo.
- Depuração de baixo nível: inspeção de amostras individuais para depurar corrupção de arquivos, problemas de carimbo de data/hora ou outros problemas.
- Criação de players personalizados: para casos de uso específicos, crie um player personalizado com controle total sobre o pipeline de mídia.
Visão geral
O exemplo de código a seguir mostra como usar 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(); } }