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

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

این ویژگی فایل محتوی (مانند 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();
  }
}