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