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

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

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

تنسيق الوسائط سمة XML نوع MIME في MediaFormat
HEVC (H.265) بروتوكول HEVC تنسيق MediaFormat.MIMETYPE_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 لم يضف التطبيق إلى قائمة فرض تحويل الترميز من جانب الخادم. عند ضبط الإعداد مفعّلة، لا يحوّل التطبيق ترميزه، وعند إيقافه، لا يجري تحويل الترميز. ويتم تفعيل هذا الخيار تلقائيًا.

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

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