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

کلاس 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) {
        throw RuntimeException(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) {
        throw new RuntimeException(e);
    } finally {
        // 3. Release the extractor
        extractor.release();
    }
}