Kodlanmış örnekleri ayıklama

MediaExtractorCompat sınıfı, platformun MediaExtractor sınıfının yerine kullanılabilir ve aynı API'leri ve işlevleri sağlar. Genellikle kodlanmış olan demukslama yapılmış medya verilerinin bir veri kaynağından çıkarılmasını kolaylaştırır.

Bir kapsayıcı dosyayı (ör. MP4 veya MKV) video, ses ve altyazı gibi ayrı parçalara ayırır. Daha sonra ayıklayıcı, bu parçalardaki ham kodlanmış verileri, kod çözücüye gönderilmeden önce bir örnekler dizisi (örneğin, tek bir sıkıştırılmış video karesi veya ses bloğu) olarak okur.

Yaygın kullanım alanları:

  • Transkodlama veya Yeniden Kapsama: Bir parçadaki kodlanmış örnekleri okuyarak kodeki değiştirme (transkodlama) veya akışları yeni bir kapsayıcıda (yeniden kapsama) yeniden paketleme (ör. MP4 dosyasını MKV'ye dönüştürme).
  • Seçici içerik ayıklama: Tek bir parçayı ayırıp kaydetme (ör. video dosyasından ses akışı ayıklama).
  • Düşük düzeyde hata ayıklama: Dosya bozulması, zaman damgası sorunları veya diğer sorunlarda hata ayıklamak için tek tek örnekleri inceleme.
  • Özel oynatıcılar oluşturma: Niş kullanım alanları için medya işlem hattı üzerinde tam kontrol sağlayan özel bir oynatıcı oluşturma.

Genel Bakış

Aşağıdaki kod örneğinde MediaExtractorCompat öğesinin nasıl kullanılacağı gösterilmektedir:

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();
  }
}