La classe MediaExtractorCompat remplace la classe MediaExtractor de la plate-forme et fournit des API et des fonctionnalités identiques. Il facilite l'extraction de données multimédias démultiplexées, généralement encodées, à partir d'une source de données.
Il sépare un fichier conteneur (comme un fichier MP4 ou MKV) en pistes individuelles, telles que la vidéo, l'audio et les sous-titres. L'extracteur lit ensuite les données brutes encodées de ces pistes sous forme de séquence d'échantillons (par exemple, une seule image vidéo compressée ou un bloc audio) avant qu'elles ne soient envoyées à un décodeur.
Voici quelques cas d'utilisation courants :
- Transcodage ou remuxage : lecture d'échantillons encodés à partir d'une piste pour modifier le codec (transcodage) ou reconditionner les flux dans un nouveau conteneur (remuxage), par exemple en convertissant un fichier MP4 en MKV.
- Extraction sélective de contenu : isoler et enregistrer une seule piste, par exemple extraire un flux audio d'un fichier vidéo.
- Débogage de bas niveau : inspection d'échantillons individuels pour déboguer la corruption de fichiers, les problèmes d'horodatage ou d'autres problèmes.
- Créer des lecteurs personnalisés : pour les cas d'utilisation spécifiques, créez un lecteur personnalisé avec un contrôle total sur le pipeline multimédia.
Présentation
L'exemple de code suivant montre comment utiliser 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) {
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();
}
}