Die Klasse MediaExtractorCompat ist ein direkter Ersatz für die Klasse MediaExtractor der Plattform und bietet identische APIs und Funktionen. Damit können demultiplexte, in der Regel codierte Media-Daten aus einer Datenquelle extrahiert werden.
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 Sie MediaExtractorCompat verwenden:
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) {
throw RuntimeException(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) {
throw new RuntimeException(e);
} finally {
// 3. Release the extractor
extractor.release();
}
}