Mengekstrak contoh yang dienkode

Class MediaExtractorCompat adalah pengganti langsung untuk class MediaExtractor platform dan menyediakan API serta fungsionalitas yang identik. Objek ini memfasilitasi ekstraksi data media yang telah di-demux, biasanya dienkode, dari sumber data.

File ini memisahkan file penampung (seperti MP4 atau MKV) menjadi jalur individual, seperti video, audio, dan subtitel. Kemudian, ekstraktor membaca data yang dienkode mentah dari trek ini sebagai urutan sampel (misalnya, satu frame video atau blok audio yang dikompresi) sebelum dikirim ke dekoder.

Kasus penggunaan umum meliputi:

  • Transcoding atau Remuxing: Membaca sampel yang dienkode dari trek untuk mengubah codec (transcoding) atau mengemas ulang aliran ke dalam penampung baru (remuxing), seperti mengonversi file MP4 ke MKV.
  • Ekstraksi konten selektif: Mengisolasi dan menyimpan satu trek, seperti mengekstrak aliran audio dari file video.
  • Penelusuran bug tingkat rendah: Memeriksa setiap sampel untuk men-debug kerusakan file, masalah stempel waktu, atau masalah lainnya.
  • Membangun pemutar kustom: Untuk kasus penggunaan khusus, bangun pemutar kustom dengan kontrol penuh atas pipeline media.

Ringkasan

Contoh kode berikut menunjukkan cara menggunakan 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();
  }
}