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 de code temporel ou d'autres problèmes.
- Créer des lecteurs personnalisés : pour les cas d'utilisation spécifiques, créer 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) { 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(); } }