Klasa MediaExtractorCompat jest zamiennikiem klasy MediaExtractor na platformie i zapewnia identyczne interfejsy API oraz funkcje. Ułatwia wyodrębnianie zdemuksowanych, zwykle zakodowanych danych multimedialnych ze źródła danych.
Rozdziela plik kontenera (np. MP4 lub MKV) na poszczególne ścieżki, takie jak wideo, audio i napisy. Ekstraktor odczytuje następnie nieprzetworzone zakodowane dane z tych ścieżek jako sekwencję próbek (np. pojedynczą skompresowaną klatkę wideo lub blok audio), zanim zostaną one wysłane do dekodera.
Częste przypadki użycia:
- Transkodowanie lub remuksowanie: odczytywanie zakodowanych próbek ze ścieżki w celu zmiany kodeka (transkodowanie) lub ponownego spakowania strumieni do nowego kontenera (remuksowanie), np. przekształcenie pliku MP4 w MKV.
- Selektywne wyodrębnianie treści: wyodrębnianie i zapisywanie pojedynczej ścieżki, np. wyodrębnianie strumienia audio z pliku wideo.
- Debugowanie niskiego poziomu: sprawdzanie poszczególnych próbek w celu debugowania uszkodzenia pliku, problemów ze znacznikiem czasu lub innych problemów.
- Tworzenie odtwarzaczy niestandardowych: w przypadku niszowych zastosowań możesz utworzyć odtwarzacz niestandardowy, który zapewni Ci pełną kontrolę nad potokiem multimediów.
Omówienie
Poniższy przykładowy kod pokazuje, jak używać 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(); } }