تحويل ترميز الوسائط إلى تنسيق متوافق

في الإصدار 12 من نظام التشغيل Android (المستوى 31 لواجهة برمجة التطبيقات) والإصدارات الأحدث، يمكن للنظام تحويل الفيديوهات المسجّلة بتنسيقات مثل HEVC (H.265) إلى AVC (H.264) تلقائيًا عند فتح الفيديوهات باستخدام تطبيق لا يتوافق مع HEVC. تتيح هذه الميزة لتطبيقات التقاط الفيديو استخدام ترميز أكثر حداثة وفعالية في ما يخص مساحة التخزين للفيديوهات التي يتم تسجيلها على الجهاز بدون التضحية بالتوافق مع التطبيقات الأخرى.

يمكن تحويل تنسيقات المحتوى التالية تلقائيًا إلى تنسيقات متوافقة مع الأجهزة:

تنسيق الوسائط سمة XML نوع MIME لتنسيق الوسائط
‫HEVC (H.265) HEVC MediaFormat.MIMETYPE_VIDEO_HEVC
HDR10HDR10 MediaFeature.HdrType.HDR10
+HDR10 ‫HDR10Plus MediaFeature.HdrType.HDR10_PLUS

يفترض Android أنّ التطبيقات يمكنها تشغيل جميع تنسيقات الوسائط، لذلك يكون تحويل ترميز الوسائط المتوافق غير مفعَّل تلقائيًا.

حالات استخدام تحويل الترميز

إنّ تحويل الترميز عملية مرهقة من الناحية الحسابية وتؤدي إلى تأخّر كبير عند فتح ملف فيديو. على سبيل المثال، يستغرق ملف فيديو HEVC مدته دقيقة واحدة حوالي 20 ثانية لإعادة ترميزه إلى AVC على هاتف Pixel 3. لهذا السبب، يجب تحويل ملف الفيديو إلى تنسيق آخر فقط عند إرساله خارج الجهاز. على سبيل المثال، عند مشاركة ملف فيديو مع مستخدمين آخرين من التطبيق نفسه أو مع خادم في السحابة الإلكترونية لا يتوافق مع تنسيقات الفيديوهات الحديثة.

لا تُعدِّل ترميز الملفات عند فتح ملفات الفيديو لتشغيلها على الجهاز أو لإنشاء صور مصغّرة.

ضبط تحويل الترميز

يمكن للتطبيقات التحكّم في سلوك تحويل الترميز من خلال الإفصاح عن ميزات الوسائط التي توفّرها. هناك طريقتان لتعريف هذه الإمكانات: في الرمز البرمجي أو في أحد الموارد.

تحديد الإمكانات في الرمز البرمجي

يمكنك تحديد إمكانات الوسائط في الرمز البرمجي من خلال إنشاء مثيل لكائن ApplicationMediaCapabilities باستخدام أداة إنشاء:

Kotlin

val mediaCapabilities = ApplicationMediaCapabilities.Builder()
    .addSupportedVideoMimeType(MediaFormat.MIMETYPE_VIDEO_HEVC)
    .addUnsupportedHdrType(MediaFeature.HdrType.HDR10)
    .addUnsupportedHdrType(MediaFeature.HdrType.HDR10_PLUS)
    .build()

Java

ApplicationMediaCapabilities mediaCapabilities = new ApplicationMediaCapabilities.Builder()
        .addSupportedVideoMimeType(MediaFormat.MIMETYPE_VIDEO_HEVC)
        .addUnsupportedHdrType(MediaFeature.HdrType.HDR10)
        .addUnsupportedHdrType(MediaFeature.HdrType.HDR10_PLUS)
        .build();

استخدِم هذا العنصر عند الوصول إلى محتوى الوسائط من خلال طُرق مثل ContentResolver#openTypedAssetFileDescriptor():

Kotlin

val providerOptions = Bundle().apply {
    putParcelable(MediaStore.EXTRA_MEDIA_CAPABILITIES, mediaCapabilities)
}
contentResolver.openTypedAssetFileDescriptor(mediaUri, mediaMimeType, providerOptions)
    .use { fileDescriptor ->
        // Content will be transcoded based on values defined in the
        // ApplicationMediaCapabilities provided.
    }

Java

Bundle providerOptions = new Bundle();
providerOptions.putParcelable(MediaStore.EXTRA_MEDIA_CAPABILITIES, mediaCapabilities);
try (AssetFileDescriptor fileDescriptor =  contentResolver.openTypedAssetFileDescriptor(mediaUri, mediaMimeType, providerOptions)) {
    // Content will be transcoded based on values defined in the
    // ApplicationMediaCapabilities provided.
}

تتيح هذه الطريقة التحكّم بشكل دقيق في مسارات الرموز البرمجية المحدّدة، مثل تفعيل تحويل الترميز فقط عند نقل ملف فيديو خارج الجهاز. وتُمنَح الأولوية لها على الطريقة الموضّحة أدناه.

تحديد الإمكانات في مورد

يتيح تحديد الإمكانات في أحد الموارد التحكّم بشكل عام في عملية تحويل الترميز. يجب عدم استخدام هذه الطريقة إلا في حالات محدَّدة جدًا. على سبيل المثال، إذا كان تطبيقك يتلقّى ملفات الفيديو فقط من تطبيقات أخرى (بدلاً من فتحها مباشرةً) ويحمّلها على خادم لا يتيح استخدام برامج ترميز الفيديو الحديثة (راجِع المثال على السيناريو 1 أدناه).

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

لاستخدام هذه الطريقة، أنشئ ملف موارد media_capabilities.xml:

<?xml version="1.0" encoding="utf-8"?>
<media-capabilities xmlns:android="http://schemas.android.com/apk/res/android">
    <format android:name="HEVC" supported="true"/>
    <format android:name="HDR10" supported="false"/>
    <format android:name="HDR10Plus" supported="false"/>
</media-capabilities>

في هذا المثال، يتم تحويل الفيديوهات بتقنية HDR المسجّلة على الجهاز بسلاسة إلى فيديو AVC SDR (بنطاق ديناميكي عادي)، في حين لا يتم تحويل الفيديوهات بتنسيق HEVC.

استخدِم علامة property ضمن علامة application لإضافة إشارة إلى ملف media capabilities. أضِف السمات التالية إلى ملف AndroidManifest.xml:

<property
    android:name="android.media.PROPERTY_MEDIA_CAPABILITIES"
    android:resource="@xml/media_capabilities" />

استخدام إمكانات الوسائط في تطبيق آخر لفتح ملف فيديو

إذا كان تطبيقك يشارك ملف فيديو مع تطبيق آخر، قد يحتاج ملف الفيديو إلى تحويل ترميزه قبل أن يتمكّن التطبيق المستلِم من فتحه.

يمكنك معالجة هذه الحالة من خلال فتح ملف فيديو باستخدام openTypedAssetFileDescriptor وتحديد رقم تعريف المستخدم للتطبيق المستلِم، والذي يمكن الحصول عليه باستخدام Binder.getCallingUid. بعد ذلك، تستخدِم المنصة إمكانات الوسائط في التطبيق المستلِم لتحديد ما إذا كان يجب إعادة ترميز ملف الفيديو.

Kotlin

val providerOptions = Bundle().apply {
    putParcelable(MediaStore.EXTRA_MEDIA_CAPABILITIES_UID, Binder.getCallingUid())
}
contentResolver.openTypedAssetFileDescriptor(mediaUri, mediaMimeType, providerOptions)
    .use { fileDescriptor ->
        // Content will be transcoded based on the media capabilities of the
        // calling app.
    }

Java

Bundle providerOptions = new Bundle();
providerOptions.putParcelable(MediaStore.EXTRA_MEDIA_CAPABILITIES_UID, Binder.getCallingUid());
try (AssetFileDescriptor fileDescriptor =  contentResolver.openTypedAssetFileDescriptor(mediaUri, mediaMimeType, providerOptions)) {
    // Content will be transcoded based on the media capabilities of the
    // calling app.
}

أمثلة على السيناريوهات

توضِّح المخطّطات البيانية التالية حالتَي الاستخدام الشائعتَين. في كلتا الحالتَين، يتم تخزين الفيديو الأصلي بتنسيق HEVC ولا يقبل تطبيق مشاركة الفيديوهات استخدام هذا التنسيق.

المثال 1: يبدأ تطبيق تسجيل الفيديو عملية تحويل الترميز. مثال 1 يُعلن تطبيق مشاركة الفيديوهات أنّه لا يتيح استخدام ترميز HEVC في ملف موارد ميزات الوسائط. بعد ذلك، يطلب التطبيق فيديو من تطبيق تسجيل الفيديو. يعالج تطبيق تسجيل الفيديو الطلب ويفتح الملف باستخدام openTypedAssetFileDescriptor، مع تحديد معرّف مستخدم تطبيق المشاركة. يؤدي ذلك إلى بدء عملية تحويل الترميز. عند استلام الفيديو الذي تم تحويل ترميزه، يتم إرساله إلى تطبيق المشاركة الذي يحمّله إلى خادم في السحابة الإلكترونية.

المثال 2: يبدأ تطبيق مشاركة الفيديو عملية تحويل الترميز. مثال 2 يشارك تطبيق تسجيل الفيديو فيديو مع تطبيق مشاركة الفيديو باستخدام عنوان موارد برمجي MediaStore. يفتح تطبيق مشاركة الفيديو ملف الفيديو باستخدام openTypedAssetFileDescriptor، ويُشير إلى أنّه لا يتيح استخدام HEVC في إمكانات الوسائط. يؤدي ذلك إلى بدء عملية تحويل ترميز الملف، وبعد اكتمالها، يتم تحميل الملف إلى أحد ملفّات الخادم في السحابة الإلكترونية.

التنسيقات غير المعلَن عنها

يتم تفعيل تحويل ترميز الوسائط المتوافقة لجميع التنسيقات التي تمّ الإبلاغ عن عدم توافقها، ويتم إيقافها لجميع التنسيقات التي تمّ الإبلاغ عن توافقها. بالنسبة إلى التنسيقات الأخرى التي لم يتم الإعلان عنها، تقرر المنصة ما إذا كانت ستُجري عملية تحويل ترميز أم لا. في Android 12، يتم إيقاف تحويل الترميز لجميع التنسيقات غير المعلَن عنها. قد يتغيّر هذا السلوك في التنسيقات الجديدة في المستقبل.

خيارات المطوّرين

يمكنك استخدام خيارات المطوّرين التالية لتجاهل سلوك تحويل الترميز التلقائي في Android:

  • إلغاء الإعدادات التلقائية لتحويل الترميز: يحدِّد هذا الإعداد ما إذا كانت المنصة تتحكّم في تحويل الترميز التلقائي أم لا. عند تفعيل خيار الإلغاء ، يتم تجاهل الإعدادات التلقائية للمنصة، ويتحكّم خيار تفعيل تحويل الترميز في تحويل الترميز التلقائي. هذا الخيار غير مفعَّل تلقائيًا.

  • تفعيل تحويل الترميز: يحدّد هذا الإعداد ما إذا كان سيتم تحويل ترميز التنسيقات التي لم يتم الإفصاح عنها تلقائيًا أم لا. يكون هذا الخيار مفعّلاً تلقائيًا، ولكن لن يسري أثره إلا في حال تفعيل تجاوز الإعدادات التلقائية لتحويل الترميز أيضًا.

  • افتراض أنّ التطبيقات متوافقة مع التنسيقات الحديثة: يتحكّم هذا الإعداد في ما يحدث عندما يحاول التطبيق تشغيل تنسيق غير مُعلَن عنه. يحدث ذلك عندما لا يحدد البيان ما إذا كان التطبيق متوافقًا مع تنسيق معيّن أم لا، أو عندما لا تضيف Google التطبيق إلى قائمة تحويل الترميز الإجباري من جهة الخادم. عند تفعيل الإعداد، لا يُجري التطبيق عملية تحويل ترميز، وعند إيقافه، يُجري التطبيق عملية تحويل ترميز. يكون هذا الخيار مفعّلاً تلقائيًا.

  • إظهار إشعارات تحويل الترميز: عند تفعيل هذا الخيار، يعرض التطبيق إشعارًا بشأن مستوى تقدّم تحويل الترميز عند بدء عملية تحويل الترميز من خلال قراءة ملف وسائط غير متوافق. يكون هذا الخيار مفعّلاً تلقائيًا.

  • إيقاف ذاكرة التخزين المؤقت لميزة "تحويل الترميز": في حال تفعيل هذا الخيار، لن تستخدم التطبيقات التي تتطلّب تحويل الترميز ملف التخزين المؤقت لميزة "تحويل الترميز". يمكن أن يكون هذا الإجراء مفيدًا أثناء التطوير لبدء تحويل ترميز ملف وسائط غير متوافق بسهولة، ولكن يمكن أن يؤدي إلى ضعف أداء الجهاز. يكون هذا الخيار غير مفعّل تلقائيًا.