في نظام التشغيل 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 مدته دقيقة واحدة إلى AVC على هاتف Pixel 3 حوالي 20 ثانية. لهذا السبب، يجب تحويل ترميز ملف فيديو فقط عند إرساله خارج الجهاز. على سبيل المثال، عند مشاركة ملف فيديو مع مستخدمين آخرين للتطبيق نفسه أو مع خادم سحابي لا يتوافق مع تنسيقات الفيديو الحديثة.
لا تحوّل الترميز عند فتح ملفات الفيديو لتشغيلها على الجهاز أو لإنشاء صور مصغّرة.
ضبط تحويل الترميز
يمكن للتطبيقات التحكّم في سلوك إعادة الترميز من خلال الإفصاح عن إمكانات الوسائط لديها. هناك طريقتان لتحديد هذه الإمكانات: في الرمز البرمجي أو في أحد الموارد.
تحديد الإمكانات في الرمز البرمجي
يمكنك تحديد إمكانات الوسائط في الرمز البرمجي من خلال إنشاء مثيل لكائن 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، ولا يتوافق تطبيق مشاركة الفيديو مع تنسيق HEVC.
المثال 1 يبدأ تطبيق تسجيل الفيديو عملية تحويل الترميز.
يُعلن تطبيق مشاركة الفيديو أنّه لا يتيح استخدام HEVC في ملف موارد إمكانات الوسائط. بعد ذلك، يطلب التطبيق فيديو من تطبيق تسجيل الفيديو. ويتولّى تطبيق تسجيل الفيديو معالجة الطلب وفتح الملف باستخدام
openTypedAssetFileDescriptor
، مع تحديد المعرّف الفريد للتطبيق المشارِك. يبدأ هذا الإجراء عملية تحويل الترميز.
عند تلقّي الفيديو المحوَّل ترميزًا، يتم تقديمه إلى تطبيق المشاركة الذي يحمّله إلى خادم في السحابة الإلكترونية.
المثال 2 يبدأ تطبيق مشاركة الفيديو عملية تحويل الترميز.
يشارك تطبيق تسجيل الفيديو فيديو مع تطبيق مشاركة الفيديو باستخدام معرّف موارد موحّد (URI) من النوع
MediaStore
. يفتح تطبيق مشاركة الفيديو ملف الفيديو باستخدام openTypedAssetFileDescriptor
، مع تحديد أنّه لا يتوافق مع HEVC في إمكانات الوسائط. يؤدي ذلك إلى بدء عملية تحويل الترميز، وبعد اكتمالها، يتم تحميل الملف إلى خادم في السحابة الإلكترونية.
التنسيقات غير المعلَن عنها
يتم تفعيل تحويل الترميز المتوافق للوسائط لجميع التنسيقات التي تم الإعلان عن أنّها غير متوافقة، ويتم إيقافه لجميع التنسيقات التي تم الإعلان عن أنّها متوافقة. بالنسبة إلى الصيغ الأخرى غير المحدّدة، يقرّر النظام الأساسي ما إذا كان سيتم تحويل الترميز أم لا. في نظام التشغيل Android 12، يتم إيقاف الترميز لجميع التنسيقات غير المعلَن عنها. قد يتغيّر هذا السلوك بالنسبة إلى التنسيقات الجديدة في المستقبل.
خيارات المطوّرين
يمكنك استخدام خيارات المطوّرين التالية لتجاوز السلوك التلقائي لترميز Android:
إلغاء الإعدادات التلقائية لتحويل الترميز: يحدّد هذا الإعداد ما إذا كانت المنصة تتحكّم في عملية تحويل الترميز التلقائي. عند تفعيل خيار "التجاهل"، يتم تجاهل الإعدادات التلقائية للمنصة ويتحكّم الإعداد enable transcoding في عملية تحويل الترميز التلقائية. يتم إيقاف هذا الخيار تلقائيًا.
تفعيل تحويل الترميز: يحدّد هذا الإعداد ما إذا كان سيتم تلقائيًا تحويل الترميز للتنسيقات غير المعلَن عنها. تكون هذه السياسة مفعَّلة تلقائيًا، ولكن لن يكون لها أي تأثير إلّا إذا تم تفعيل الخيار تجاهل الإعدادات التلقائية لترميز الفيديو أيضًا.
افتراض أنّ التطبيقات تتوافق مع التنسيقات الحديثة: يتحكّم هذا الإعداد في ما يحدث عندما يحاول التطبيق تشغيل تنسيق غير معرَّف. يحدث ذلك عندما لا يوضّح ملف البيان ما إذا كان التطبيق يتيح استخدام تنسيق معيّن أم لا، أو عندما لا تضيف Google التطبيق إلى قائمة فرض الترميز على الخادم. عند تفعيل هذا الإعداد، لا يحوّل التطبيق الترميز، وعند إيقافه، يحوّل التطبيق الترميز. يتم تفعيل هذا الخيار تلقائيًا.
إظهار إشعارات تحويل الترميز عند تفعيل هذا الخيار، يعرض التطبيق إشعارًا بمدى تقدّم عملية تحويل الترميز عندما يتم تشغيلها من خلال قراءة ملف وسائط غير متوافق. يتم تفعيل هذا الخيار تلقائيًا.
إيقاف ذاكرة التخزين المؤقت لميزة "تحويل الترميز": في حال تفعيل هذا الخيار، لن تستخدم التطبيقات التي تتطلّب تحويل الترميز ذاكرة التخزين المؤقت لميزة "تحويل الترميز". يمكن أن يكون ذلك مفيدًا أثناء عملية التطوير لتفعيل الترميز بسهولة على ملف وسائط غير متوافق، ولكن قد يؤدي إلى ضعف أداء الجهاز. يكون هذا الخيار غير مفعّل تلقائيًا.