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

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

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

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

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

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

تُعدّ عملية تحويل الترميز مكلفة من الناحية الحسابية وتؤدي إلى تأخير كبير عند فتح ملف فيديو. على سبيل المثال، يستغرق تحويل ترميز ملف فيديو HEVC مدته دقيقة واحدة إلى AVC حوالي 20 ثانية على هاتف 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 وتحديد معرّف UID الخاص بالتطبيق المستلِم، والذي يمكن الحصول عليه باستخدام 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، مع تحديد معرّف UID الخاص بتطبيق المشاركة. سيؤدي ذلك إلى بدء عملية تحويل الترميز. عند استلام الفيديو الذي تم تحويل ترميزه، يتم إرساله إلى تطبيق المشاركة الذي يحمّله إلى خادم في السحابة الإلكترونية.

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

أشكال الإعلانات غير المُعلَن عنها

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

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

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

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

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

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

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

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