استخراج العيّنات المشفَّرة

الفئة MediaExtractorCompat هي بديل جاهز للاستخدام للفئة MediaExtractor في المنصة، وتوفّر واجهات برمجة تطبيقات ووظائف مماثلة. تسهّل هذه السمة استخراج بيانات الوسائط المتعددة التي تم فك ترميزها، والتي تكون عادةً مرمّزة، من مصدر بيانات.

وهي تفصل ملف الحزمة (مثل MP4 أو MKV) إلى مقاطع فردية، مثل الفيديو والصوت والترجمة. بعد ذلك، يقرأ برنامج الاستخراج البيانات المرمّزة الأولية من هذه المقاطع على شكل سلسلة من العينات (على سبيل المثال، إطار فيديو مضغوط واحد أو مقطع صوتي) قبل إرسالها إلى برنامج فك الترميز.

تشمل حالات الاستخدام الشائعة ما يلي:

  • تحويل الترميز أو إعادة التجميع: قراءة عيّنات مرمّزة من مسار لتغيير برنامج الترميز (تحويل الترميز) أو إعادة تجميع البيانات في حاوية جديدة (إعادة التجميع)، مثل تحويل ملف MP4 إلى MKV
  • استخراج المحتوى بشكل انتقائي: عزل مسار واحد وحفظه، مثل استخراج بث صوتي من ملف فيديو
  • تصحيح الأخطاء على مستوى منخفض: فحص عيّنات فردية لتصحيح أخطاء تلف الملفات أو مشاكل الطوابع الزمنية أو غيرها من المشاكل
  • إنشاء مشغّلات مخصّصة: بالنسبة إلى حالات الاستخدام المتخصّصة، يمكنك إنشاء مشغّل مخصّص مع إمكانية التحكّم الكامل في مسار الوسائط.

نظرة عامة

يوضّح نموذج الرمز البرمجي التالي كيفية استخدام 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) {
        throw RuntimeException(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) {
        throw new RuntimeException(e);
    } finally {
        // 3. Release the extractor
        extractor.release();
    }
}