Die Klasse MediaExtractorCompat ist ein direkter Ersatz für die Klasse MediaExtractor der Plattform und bietet identische APIs und Funktionen. Sie ermöglicht das Extrahieren von demultiplexten, in der Regel codierten Mediendaten aus einer Datenquelle.
Dabei wird eine Containerdatei (z. B. MP4 oder MKV) in ihre einzelnen Tracks wie Video, Audio und Untertitel aufgeteilt. Der Extractor liest dann die rohen, codierten Daten aus diesen Tracks als Sequenz von Samples (z. B. ein einzelnes komprimiertes Videobild oder ein Audioblock), bevor sie an einen Decoder gesendet werden.
Zu den häufigsten Anwendungsfällen gehören:
- Transcodieren oder Remuxen: Codierte Samples aus einem Track lesen, um entweder den Codec zu ändern (Transcodieren) oder die Streams in einen neuen Container zu verpacken (Remuxen), z. B. eine MP4-Datei in MKV konvertieren.
- Selektive Inhaltsextraktion: Einen einzelnen Track isolieren und speichern, z. B. einen Audiostream aus einer Videodatei extrahieren.
- Debugging auf niedriger Ebene: Einzelne Stichproben untersuchen, um Dateibeschädigungen, Zeitstempelprobleme oder andere Probleme zu beheben.
- Benutzerdefinierte Player erstellen: Für spezielle Anwendungsfälle können Sie einen benutzerdefinierten Player erstellen, mit dem Sie die volle Kontrolle über die Media-Pipeline haben.
Übersicht
Das folgende Codebeispiel zeigt, wie MediaExtractorCompat verwendet wird:
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(); } }