MediaExtractorCompat クラスは、プラットフォームの MediaExtractor クラスのドロップイン置換であり、同じ API と機能を提供します。これにより、データソースからデマルチプレックスされた(通常はエンコードされた)メディアデータの抽出が容易になります。
コンテナ ファイル(MP4 や MKV など)を動画、音声、字幕などの個々のトラックに分離します。抽出ツールは、これらのトラックから未加工のエンコードされたデータをサンプルのシーケンス(圧縮された単一の動画フレームや音声ブロックなど)として読み取り、デコーダに送信します。
一般的なユースケースは次のとおりです。
- トランスコードまたはリミックス: トラックからエンコードされたサンプルを読み取り、コーデックを変更(トランスコード)するか、ストリームを新しいコンテナに再パッケージ(リミックス)します(MP4 ファイルを MKV に変換するなど)。
- 選択的なコンテンツ抽出: 単一のトラックを分離して保存します(動画ファイルから音声ストリームを抽出するなど)。
- 低レベルのデバッグ: 個々のサンプルを検査して、ファイルの破損、タイムスタンプの問題などの問題をデバッグします。
- カスタム プレーヤーの構築: ニッチなユースケース向けに、メディア パイプラインを完全に制御できるカスタム プレーヤーを構築します。
概要
次のコードサンプルは、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(); } }