استخراج نمونه‌های کدگذاری‌شده

کلاس MediaExtractorCompat جایگزینی برای کلاس MediaExtractor پلتفرم است و APIها و عملکردهای یکسانی را ارائه می‌دهد. این کلاس استخراج داده‌های رسانه‌ای demux شده، معمولاً کدگذاری شده، را از یک منبع داده تسهیل می‌کند.

این ابزار یک فایل کانتینر (مانند MP4 یا MKV) را به تراک‌های جداگانه‌اش، مانند ویدیو، صدا و زیرنویس، تقسیم می‌کند. سپس استخراج‌کننده، داده‌های خام و کدگذاری‌شده را از این تراک‌ها به عنوان دنباله‌ای از نمونه‌ها (به عنوان مثال، یک فریم ویدیویی فشرده یا بلوک صوتی) قبل از ارسال به یک رمزگشا می‌خواند.

موارد استفاده رایج عبارتند از:

  • تبدیل کد یا ریموکس کردن : خواندن نمونه‌های کدگذاری شده از یک آهنگ برای تغییر کدک (تبدیل کد) یا بسته‌بندی مجدد جریان‌ها در یک ظرف جدید (ریموکس کردن)، مانند تبدیل یک فایل MP4 به MKV.
  • استخراج انتخابی محتوا : جداسازی و ذخیره یک آهنگ واحد، مانند استخراج جریان صوتی از یک فایل ویدیویی.
  • اشکال‌زدایی سطح پایین : بررسی نمونه‌های منفرد برای اشکال‌زدایی خرابی فایل، مشکلات مربوط به مهر زمانی یا سایر مشکلات.
  • ساخت پخش‌کننده‌های سفارشی : برای موارد استفاده خاص، ساخت یک پخش‌کننده سفارشی با کنترل کامل بر خط تولید رسانه.

نمای کلی

نمونه کد زیر نحوه استفاده از MediaExtractorCompat را نشان می‌دهد:

کاتلین

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

جاوا

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