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

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

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

آلية العمل

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

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

يعرض الشكل 1 نظرة عامة على عملية تحويل ترميز الوسائط.

عملية تحويل الوسائط إلى تنسيق متوافق

الشكل 1: نظرة عامة على تحويل الوسائط إلى تنسيق متوافق

التنسيقات المعتمدة

تتيح ميزة "تحويل الوسائط إلى تنسيق متوافق" عمليات التحويل التالية للتنسيقات:

  • تحويل HEVC (8 بت) إلى AVC: يتم إجراء عمليات تحويل الترميز والتشفير من خلال ربط أداة فك ترميز mediacodec واحدة وأداة ترميز mediacode واحدة.
  • التحويل من HDR10+‎ (10 بت) إلى AVC (النطاق الديناميكي العادي): يتم إجراء عمليات التحويل من HDR إلى SDR باستخدام مثيلات mediacodec وربط إضافة مورّد بمثيلات برنامج الترميز. لمزيد من المعلومات، يُرجى الاطّلاع على ترميز HDR إلى SDR.

مصادر المحتوى المتوافقة

تتوافق ميزة تحويل ترميز الوسائط مع الوسائط التي تم إنشاؤها على الجهاز باستخدام تطبيق الكاميرا الأصلي من مصنّع الجهاز الأصلي والمخزَّنة في المجلد DCIM/Camera/ في وحدة التخزين الخارجية الأساسية. لا تتوافق الميزة مع الوسائط المخزّنة في وحدة التخزين الثانوية. لا يمكن استخدام المحتوى الذي يتم نقله إلى الأجهزة من خلال البريد الإلكتروني أو بطاقات SD.

تصل التطبيقات إلى الملفات استنادًا إلى مسارات ملفات مختلفة. في ما يلي وصف لمسارات الملفات التي يتم فيها تفعيل الترميز أو تجاوزه:

  • تم تفعيل تحويل الترميز:

    • وصول التطبيق من خلال واجهات برمجة التطبيقات MediaStore
    • الوصول إلى التطبيقات من خلال واجهات برمجة التطبيقات المباشرة لمسار الملف، بما في ذلك رمز Java والرموز البرمجية الأصلية
    • الوصول إلى التطبيقات من خلال إطار عمل الوصول إلى مساحة التخزين (SAF)
    • الوصول إلى التطبيق من خلال نوايا صفحة المشاركة في نظام التشغيل (معرّف الموارد المنتظم (URI) في MediaStore فقط)
    • نقل الملفات باستخدام بروتوكول نقل الوسائط (MTP) أو بروتوكول نقل الصور (PTP) من الهاتف إلى الكمبيوتر
  • تم تجاوز عملية تحويل الترميز:

    • نقل ملف من جهاز عن طريق إخراج بطاقة SD
    • نقل الملفات من جهاز إلى آخر باستخدام خيارات مثل "المشاركة عن قرب" أو النقل عبر البلوتوث

إضافة مسارات ملفات مخصّصة لترميز الفيديو

يمكن لمصنّعي الأجهزة إضافة مسارات الملفات لترميز الوسائط اختياريًا ضمن الدليل DCIM/. ويتم رفض أي مسارات خارج الدليل DCIM/. قد تكون إضافة مسارات الملفات هذه مطلوبة لاستيفاء متطلبات شركات النقل أو اللوائح التنظيمية المحلية.

لإضافة مسار ملف، استخدِم مسار تحويل الترميز تراكب الموارد في الوقت الفعلي (RRO)، config_supported_transcoding_relative_paths. في ما يلي مثال على كيفية إضافة مسار ملف:

<string-array name="config_supported_transcoding_relative_paths" translatable="false">
    <item>DCIM/JCF/</item>
</string-array>

للتحقّق من مسارات الملفات التي تم ضبطها، استخدِم ما يلي:

adb shell dumpsys activity provider com.google.android.providers.media.module/com.android.providers.media.MediaProvider | head -n 20

نظرة عامة على البنية

يوضّح هذا القسم بنية ميزة تحويل ترميز الوسائط.

media-transcoding-architecture

الشكل 2: بنية تحويل ترميز الوسائط

تتألف بنية تحويل ترميز الوسائط من المكوّنات التالية:

  • واجهة برمجة تطبيقات MediaTranscodingManager للنظام: واجهة تتيح للعميل التواصل مع خدمة MediaTranscoding. تستخدم وحدة MediaProvider واجهة برمجة التطبيقات هذه.
  • MediaTranscodingService: خدمة أصلية تدير اتصالات العملاء، وتجدول طلبات تحويل الترميز، وتدير مسك الدفاتر في TranscodingSessions.
  • MediaTranscoder: مكتبة مجمّعة من رموز برمجية أصلية تنفّذ عملية تحويل الترميز. تم إنشاء هذه المكتبة استنادًا إلى حزمة تطوير البرامج الأصلية (NDK) لإطار عمل الوسائط لتكون متوافقة مع الوحدات.

تسجّل ميزة تحويل الوسائط إلى تنسيق متوافق مقاييس تحويل الترميز في كل من الخدمة ومحوّل ترميز الوسائط. يتم تضمين الرمز البرمجي من جهة العميل ومن جهة الخادم في وحدة MediaProvider للسماح بإصلاح الأخطاء وتوفير التحديثات في الوقت المناسب.

إذن الوصول إلى الملف

تستند عملية تحويل الوسائط إلى تنسيق متوافق إلى نظام ملفات Filesystem in Userspace (FUSE)، والذي يُستخدم في مساحة التخزين المحصورة. تتيح FUSE لوحدة MediaProvider فحص عمليات الملفات في مساحة المستخدمين، كما تتيح لها التحكّم في إذن الوصول إلى الملفات استنادًا إلى السياسة التي تسمح بالوصول أو ترفضه أو تحجبه.

عندما يحاول تطبيق الوصول إلى ملف، يعترض برنامج FUSE الخفي إذن الوصول إلى قراءة الملف من التطبيق. وإذا كان التطبيق متوافقًا مع تنسيق أحدث (مثل HEVC)، يتم عرض الملف الأصلي. إذا كان التطبيق لا يتوافق مع التنسيق، يتم تحويل ترميز الملف إلى تنسيق أقدم (مثل AVC) أو يتم عرضه من ذاكرة التخزين المؤقت إذا كان يتوفّر إصدار محوّل الترميز.

طلب ملفات محوّلة ترميزيًا

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

  • عليك الإفصاح عن التنسيقات غير المتوافقة في ملف البيان. لمعرفة التفاصيل، يُرجى الاطّلاع على تعريف الإمكانات في أحد الموارد وتعريف الإمكانات في الرمز.
  • إيقاف التنسيقات المتوافقة باستخدام إطار عمل توافق التطبيقات في وقت التشغيل (يمكن للمستخدمين أيضًا إيقاف هذه الميزة لكل تطبيق في "الإعدادات")
  • فتح ملف باستخدام MediaStore مع تحديد التنسيقات غير المتوافقة بشكل صريح باستخدام واجهة برمجة التطبيقات openTypedAssetFileDescriptor

بالنسبة إلى عمليات نقل البيانات عبر USB (من الجهاز إلى الكمبيوتر)، تكون عملية تحويل الترميز غير مفعّلة تلقائيًا، ولكن يمكن للمستخدمين تفعيلها باستخدام زر التبديل تحويل الفيديوهات إلى ترميز AVC في شاشة إعدادات إعدادات USB كما هو موضّح في الشكل 3.

التبديل لتفعيل تحويل ترميز الوسائط

الشكل 3: انقر على زر الإيقاف/التفعيل لتفعيل تحويل الترميز للوسائط في شاشة "إعدادات USB".

القيود المفروضة على طلب ملفات محوَّلة ترميزيًا

لمنع طلبات تحويل الترميز من حظر موارد النظام لفترات طويلة، يتم فرض القيود التالية على التطبيقات التي تطلب جلسات تحويل الترميز:

  • 10 جلسات متتالية
  • إجمالي مدة التشغيل ثلاث دقائق

إذا تجاوز أحد التطبيقات جميع هذه القيود، سيعرض إطار العمل واصف الملف الأصلي.

متطلبات الجهاز

لدعم ميزة تحويل الوسائط إلى تنسيق متوافق، يجب أن تستوفي الأجهزة المتطلبات التالية:

  • تفعيل ترميز HEVC تلقائيًا على تطبيق الكاميرا الأصلي
  • (الأجهزة التي تتيح تحويل الترميز من HDR إلى SDR) الجهاز يتيح التقاط الفيديو بتقنية HDR

لضمان أداء الجهاز عند تحويل ترميز الوسائط، يجب تحسين أداء قراءة/كتابة بيانات الفيديو في الأجهزة ومساحة التخزين. عند ضبط برامج ترميز الوسائط على أولوية تساوي 1، يجب أن تعمل برامج الترميز بأعلى معدل نقل ممكن. ننصح بأن يحقّق أداء تحويل الترميز حدًا أدنى يبلغ 200 لقطة في الثانية. لاختبار أداء الأجهزة، شغِّل معيار قياس أداء برنامج ترميز الوسائط على frameworks/av/media/libmediatranscoding/transcoder/benchmark.

التحقق من صحة البيانات

للتحقّق من صحة ميزة تحويل الوسائط إلى تنسيق متوافق، شغِّل اختبارات مجموعة أدوات اختبار التوافق (CTS) التالية:

  • android.media.mediatranscoding.cts
  • android.mediaprovidertranscode.cts

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

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

التحقّق من حالة تحويل الترميز

أثناء الاختبار، يمكنك استخدام أمر ADB shell التالي للتحقّق من حالة تحويل الترميز، بما في ذلك جلسات تحويل الترميز الحالية والسابقة:

adb shell dumpsys media.transcoding

إطالة مدة الفيديو

لأغراض الاختبار، يمكنك تمديد الحد الأقصى لطول الفيديو البالغ دقيقة واحدة لعملية تحويل الترميز باستخدام الأمر التالي. قد تحتاج إلى إعادة التشغيل بعد تنفيذ هذا الأمر.

adb shell device_config put storage_native_boot transcode_max_duration_ms <LARGE_NUMBER_IN_MS>

المراجع ورمز المصدر لنظام التشغيل AOSP

في ما يلي رمز مصدر AOSP المرتبط بتحويل الوسائط إلى تنسيق متوافق.

الترميز من HDR إلى SDR

لإتاحة ترميز HDR إلى SDR، يمكن لمصنّعي الأجهزة استخدام نموذج AOSP لمكوّن Codec 2.0 الإضافي الخاص بفلتر الترميز والموجود في /platform/frameworks/av/media/codec2/hidl/plugin/. يوضّح هذا القسم طريقة عمل المكوّن الإضافي الخاص بالفلاتر وكيفية تنفيذه واختباره.

إذا لم يتضمّن الجهاز إضافة متوافقة مع ترميز HDR إلى SDR، سيحصل التطبيق الذي يصل إلى فيديو HDR على واصف الملف الأصلي بغض النظر عن إمكانات الوسائط التي أعلن عنها التطبيق في ملف البيان.

آلية العمل

يوضّح هذا القسم السلوك العام لمكوّن Codec 2.0 الإضافي الخاص بفلتر.

خلفية

يوفر نظام التشغيل Android تنفيذًا لطبقة التكييف بين واجهة برنامج الترميز 2.0 وواجهة android.hardware.media.c2 HAL في android::hardware::media::c2. بالنسبة إلى مكوّنات فلتر إضافية، يتضمّن مشروع AOSP آلية لتغليف برامج الترميز مع مكوّنات فلتر إضافية. MediaCodec يتعرّف على هذه المكوّنات المغلفة باعتبارها برامج ترميز تتضمّن ميزات فلترة.

نظرة عامة

تتلقّى الفئة FilterWrapper برامج الترميز الخاصة بالمورّد وتعرض برامج الترميز المغلفة مرة أخرى على طبقة التكيّف media.c2. يحمّل الصف FilterWrapper libc2filterplugin.so من خلال واجهة برمجة التطبيقات FilterWrapper::Plugin ويسجّل الفلاتر المتاحة من المكوّن الإضافي. عند الإنشاء، ينشئ FilterWrapper جميع الفلاتر المتاحة. لا يتم بدء تشغيل سوى الفلاتر التي تغيّر المخزن المؤقت عند بدء التشغيل.

بنية المكوّن الإضافي للفلتر

الشكل 4. بنية المكوّن الإضافي للفلتر

واجهة المكوّن الإضافي للفلترة

تحدّد واجهة FilterPlugin.h واجهات برمجة التطبيقات التالية لعرض الفلاتر:

  • std::shared_ptr<C2ComponentStore>getComponentStore()

    تعرِض هذه الدالة عنصر C2ComponentStore يحتوي على فلاتر. ويختلف ذلك عن ما تعرضه عملية تنفيذ Codec 2.0 الخاصة بالمورّد. عادةً، لا يحتوي هذا المتجر إلا على الفلاتر التي تستخدمها الفئة FilterWrapper.

  • bool describe(C2String name, Descriptor *desc)

    تصف هذه السمة الفلاتر بالإضافة إلى الفلاتر المتاحة من C2ComponentStore. يتم تحديد الأوصاف التالية:

    • controlParam: مَعلمات تتحكّم في سلوك الفلاتر. على سبيل المثال، بالنسبة إلى أداة تحويل تدرّج الألوان من HDR إلى SDR، تكون مَعلمة التحكّم هي وظيفة النقل المستهدَفة.
    • affectedParams: المَعلمات التي تتأثر بعمليات الفلترة. على سبيل المثال، بالنسبة إلى أداة تحويل النطاق الديناميكي العالي (HDR) إلى النطاق الديناميكي العادي (SDR)، تكون المَعلمات المتأثرة هي جوانب الألوان.
  • bool isFilteringEnabled(const std::shared_ptr<C2ComponentInterface> &intf)

    تعرض true إذا كان مكوّن الفلتر يغيّر المخزن المؤقت. على سبيل المثال، يعرض فلتر &quot;مطابقة الألوان&quot; القيمة true إذا كانت وظيفة النقل المستهدَفة هي SDR وكانت وظيفة النقل المُدخَلة هي HDR (HLG أو PQ).

تفاصيل FilterWrapper

يصف القسم تفاصيل الفئة FilterWrapper.

الإنشاء

ينشئ المكوّن المغلَّف وحدة فك الترميز الأساسية وجميع الفلاتر المحدّدة عند الإنشاء.

طلب البحث والإعداد

يفصل المكوّن المغلَّف المَعلمات الواردة عن طلبات البحث أو طلبات الإعدادات وفقًا لوصف الفلتر. على سبيل المثال، يتم توجيه إعدادات مَعلمة عنصر التحكّم في الفلتر إلى الفلتر المعنيّ، وتظهر المَعلمات المتأثرة من الفلاتر في طلبات البحث (بدلاً من القراءة من أداة فك الترميز التي تحتوي على مَعلمات غير متأثرة).

طلب البحث والإعداد

الشكل 5. طلب البحث والإعدادات

بدء

في البداية، يبدأ المكوّن المغلَّف بفك الترميز وجميع الفلاتر التي تعدّل المخازن المؤقتة. في حال عدم تفعيل أي فلتر، يبدأ المكوّن المغلَّف برنامج الترميز وبرامج التخزين المؤقت التي يتم نقل البيانات من خلالها، ويرسل أوامر إلى برنامج الترميز نفسه.

معالجة المخزن المؤقت

معالجة المخزن المؤقت

الشكل 6. التعامل مع المخزن المؤقت

يتم إرسال المخازن المؤقتة التي تمّت إضافتها إلى أداة فك الترميز المغلَّفة إلى أداة فك الترميز الأساسية. يحصل المكوّن المغلَّف على مخزن الإخراج المؤقت من برنامج الترميز من خلال دالة رد الاتصال onWorkDone_nb()، ثم يضيفه إلى قائمة انتظار الفلاتر. يتم إرسال المخزن المؤقت للناتج النهائي من الفلتر الأخير إلى العميل.

لكي يعمل التعامل مع المخزن المؤقت هذا، يجب أن يضبط المكوّن المغلَّف C2PortBlockPoolsTuning على الفلتر الأخير حتى تتمكّن المخازن المؤقتة لناتج إطار العمل من مجموعة الحظر المتوقّعة.

الإيقاف وإعادة الضبط والإفراج

عند التوقف، يوقف المكوّن المغلَّف أداة فك الترميز وجميع الفلاتر المفعَّلة التي تم تشغيلها. عند إعادة الضبط والإصدار، تتم إعادة ضبط جميع المكوّنات أو إصدارها بغض النظر عمّا إذا كانت مفعّلة أم لا.

تنفيذ المكوّن الإضافي لفلتر العيّنات

لتفعيل المكوّن الإضافي، اتّبِع الخطوات التالية:

  1. تنفيذ واجهة FilterPlugin في مكتبة وإسقاطها في /vendor/lib[64]/libc2filterplugin.so.
  2. أضِف أذونات إضافية إلى mediacodec.te إذا لزم الأمر.
  3. حدِّث طبقة التكيّف إلى Android 12 وأعِد إنشاء خدمة media.c2.

اختبار المكوّن الإضافي

لاختبار المكوّن الإضافي النموذجي، اتّبِع الخطوات التالية:

  1. أعِد إنشاء الجهاز وتثبيت البرنامج عليه.
  2. أنشئ المكوّن الإضافي النموذجي باستخدام الأمر التالي:

    m sample-codec2-filter-plugin
    
  3. أعِد تثبيت الجهاز وأعِد تسمية إضافة المورّد لتتمكّن خدمة الترميز من التعرّف عليها.

    adb root
    adb remount
    adb reboot
    adb wait-for-device
    adb root
    adb remount
    adb
    push /out/target/<...>/lib64/sample-codec2-filter-plugin.so \
    
    /vendor/lib64/libc2filterplugin.so
    adb push
    /out/target/<...>/lib/sample-codec2-filter-plugin.so \
    
    /vendor/lib/libc2filterplugin.so
    adb reboot