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

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

يمكن تحويل ترميز التنسيقات التالية تلقائيًا للمحتوى الذي يتم إنشاؤه على الجهاز:

تنسيق الوسائط سمة XML نوع MIME بتنسيق MediaFormat
HEVC (H.265) تنسيق HEVC تنسيق MediaFormat.MIME_VIDEO_HEVC
تقنية HDR10تقنية HDR10 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 لإضافة مرجع إلى ملف إمكانيات الوسائط. أضِف السمات التالية إلى ملف 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 ولا يتوافق تطبيق مشاركة الفيديو مع تنسيق HEVC.

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

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

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

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

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

يمكنك استخدام خيارات المطوّرين التالية لإلغاء سلوك تحويل الترميز التلقائي على Android:

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

  • تفعيل تحويل الترميز يحدد هذا الإعداد ما إذا كان سيتم تحويل ترميز التنسيقات غير المعلَنة تلقائيًا أم لا. تكون هذه الطريقة مفعَّلة تلقائيًا ولكن ليس لها أي تأثير إلا إذا تم أيضًا تفعيل إلغاء الإعدادات التلقائية لتحويل الترميز.

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

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

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