أفضل الممارسات لمشاركة الفيديو

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

أهم شيء هو الحفاظ على دقة ثابتة والحفاظ على جودة الفيديو بأعلى قدر ممكن لأطول فترة ممكنة أثناء التحضير لمشاركة الفيديو.

مسار المشاركة

يوضح الشكل 1 التدفق النموذجي لمشاركة فيديو:

مسار مشاركة الفيديوهات الشكل 1. يشير هذا المصطلح إلى مسار مشاركة الفيديو.

يتضمن المسار هذه الخطوات:

  1. يمكنك التقاط فيديو وترميزه، مع إمكانية إضافة تأثيرات أثناء التقاطه. بدلاً من ذلك، يمكن للمستخدم تخطّي هذه الخطوة واختيار فيديو من مساحة التخزين تم تسجيله مسبقًا من تطبيق آخر.
  2. عدِّل الفيديو أو فلتِره أو عدِّله أو عالِجه بأي طريقة أخرى.
  3. يمكنك تغيير حجم الفيديو أو تغيير حجمه استعدادًا لتحويل الترميز.
  4. تحويل ترميز الفيديو لمشاركته غالبًا ما يتم تطبيق التصفية في الخطوة 2 كجزء من هذه الخطوة.

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

الفيديوهات المقترَحة

ويوضح الجدول 1 المعلمات الرئيسية الخمس لجودة الفيديو، ويشير إلى الخطوات التي يمكن استخدامها.

المَعلمة تصوير القصة مشاركة
الملف الشخصي Y Y
درجة الدقة Y Y
معدل نقل البيانات Y Y
معلمة الكمية (QP) (نادرًا) Y
الإطارات B N Y

الجدول 1. المعلمات الرئيسية التي تحدّد جودة الفيديو

الملف الشخصي

للحصول على نتائج أفضل، استخدم الملفات الشخصية الأكثر تقدمًا التي يوفرها برنامج الترميز المعني. بالنسبة إلى ترميز AVC، اختَر "ملف شخصي كبير" و"المستوى 4".

الدقة والاقتصاص والتحجيم

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

  • اختَر درجة دقة لا تقل عن دقة المشاركة النهائية.
  • يجب ألا تتجاوز دقة الالتقاط درجة دقة المشاركة بشكل كبير ما لم تكن جميع الخطوات المتوسطة مصممة لدعم درجة الدقة الأكبر (مثل معدل نقل بيانات أعلى أثناء الالتقاط الأولي).

    • إذا نتج عن ترميز المشاركة درجة دقة 720x1280، ننصحك بدقة الالتقاط 720x1280.
    • إذا كانت الخطوات الوسيطة بين الالتقاط والمشاركة تتضمن اقتصاصًا، فيمكنك استخدام درجة دقة أعلى للالتقاط مثل 1080×1920، وزيادة معدل نقل بيانات الالتقاط للتعامل مع وحدات البكسل الإضافية.
  • يؤدي الاقتصاص الشديد إلى الحصول على صورة ذات جودة منخفضة، خاصةً إذا تم تكبير الصورة التي تم اقتصاصها.

  • تجنب تكبير الصورة من درجة الدقة المنخفضة إلى درجة الدقة الأعلى. تحاول الترقية إنشاء تفاصيل غير موجودة. واحمل درجة الدقة الأعلى المطلوبة من البداية.

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

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

معدل نقل البيانات درجة الدقة
أكثر من 5 ميغابت في الثانية 1080×1920
من 1.5 إلى 5 ميغابت في الثانية أو أكثر 720×1280
1.5 ميغابت في الثانية أو أقل ما يعادل الدقّة العادية يبلغ عدد وحدات البكسل نفسه في نسبة العرض إلى الارتفاع 9:16 حوالي 416×736

الجدول 2. معدل نقل البيانات مقابل الدقة

تشارك العديد من التطبيقات الرائجة الفيديوهات بدرجة الدقة 720p أو أقل. تشير البيانات إلى أنّ درجة الدقة 720p هي الاختيار المناسب لمعدلات نقل البيانات المستهدفة التي تتراوح بين 1.5 و5 ميغابت في الثانية.

معدل نقل البيانات

يتم التسجيل

إنّ استخدام معدل نقل بيانات أعلى للترميز يقدّم أكبر تحسُّن في جودة الفيديو. ننصحك باختيار معدلات نقل بيانات تتلاءم مع تطبيقات الكاميرا الأصلية. للحصول على درجة دقة 720×1280، ننصح باستخدام معدل نقل بيانات للتسجيل يبلغ 10 ميغابت في الثانية.

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

ويمكنك تقليل معدل نقل البيانات في خطوة تحويل الترميز النهائية، كما هو موضّح في الجدول 2.

المشاركة

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

كما أن اختيار ملف تعريف الترميز والإطارات B وقيم حدود QP هو أيضًا أكثر أهمية في هذه المرحلة مما هو عليه أثناء التقاط.

ننصح باستخدام معدل نقل بيانات يتراوح بين 4 و5 ميغابت في الثانية (بالنسبة إلى درجة الدقة 720 × 1280) لضمان جودة مرئية جيدة.

معلمة الكمية (QP)

في نظام التشغيل Android 12 والإصدارات الأحدث، يتم توحيد مفاتيح QP وتتوفر في واجهة برمجة التطبيقات MediaFormat وفي مكتبة وسائط NDK. في إصدارات Android السابقة، لا تتوفّر معالجة QP إلا من خلال دوال إطار العمل باستخدام المفاتيح الخاصة بالمورّد في إعدادات MediaFormat.

يتم التسجيل

أثناء تسجيل الفيديو، استخدِم إعدادات التحكم في معدل نقل البيانات بدلاً من إعدادات QP، التي لا تكون متوفرة دائمًا.

لا ننصح بضبط إعدادات QP لتسجيل معدل نقل بيانات يبلغ 10 ميغابت في الثانية (720×1280). إذا كان معدل نقل بيانات الالتقاط أقل بكثير، أي أقل من 5 ميغابت في الثانية بالنسبة إلى 720×1280، يشكّل ضبط QP على 40 حلاً جيدًا ما بين زيادة الجودة بدون فرض برنامج الترميز على تجاوز معدل نقل البيانات المستهدف في كثير من الأحيان.

المشاركة

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

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

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

الإطارات بـ B وملفات تعريف الترميز

ننصحك باستخدام الإطارات B خلال خطوة المشاركة فقط وألّا تستخدم سوى الإصدار 10 من نظام Android أو إصدار أحدث.

يجب أن تتحقّق التطبيقات من الملفات الشخصية للترميز المتوافقة باستخدام CodecCapabilities، لأنّ بعض الأجهزة لا تتوافق مع الملفات الشخصية للترميز الرئيسية أو العالية. استخدِم أعلى ملف شخصي متوافق مع برنامج ترميز AVC: عالية > رئيسي > خط أساسي. للحصول على النتائج الأكثر أمانًا، تجنَّب ضبط الإطارات B (KEY_LATENCY أو KEY_MAX_B_FRAMES) عند استخدام الملف الشخصي الأساسي لأنّه قد يتعذّر ضبط إعدادات بعض برامج الترميز.

تفترض مقاطع الرموز التالية وجود 'MediaFormat format' الذي سيتم استخدامه لضبط برنامج ترميز AVC

Android 10

API 29 أو إصدار أحدث

استخدِم أعلى ملف شخصي متوافق واضبط المَعلمة ذات الإطار B على 1:

format.setInt32(KEY_PROFILE, AVCProfileHigh);
format.setInt32(KEY_MAX_B_FRAMES, 1);

لا تضبط KEY_LATENCY في هذه الحالة.

الإصدارات 8 و8.1 و9 من Android

واجهات برمجة التطبيقات 26 و27 و28

استخدام الملف الشخصي الأعلى دعمًا، ولكن مع إيقاف إنشاء الإطارات B. يستوفي ذلك بعض القيود في MediaMuxer في إصدارات النظام هذه.

format.setInt32(KEY_PROFILE, AVCProfileHigh);
format.setInt32(KEY_LATENCY, 1);

تمنع القيمة KEY_LATENCY برامج الترميز من إنشاء الإطارات-B، ولكنّها تستفيد من كفاءات برامج الترميز الأخرى.

إذا كان تطبيقك لا يستخدم MediaMuxer لتجميع ملف الإخراج النهائي، يمكنك تفعيل الإطارات B من خلال ضبط القيمة KEY_LATENCY على 2 بدلاً من 1. وهذا من شأنه السماح لبرنامج الترميز بإنتاج الإطارات B.

Android 7.1 والإصدارات الأقدم

API 25 والإصدارات الأقدم

استخدِم الملف الشخصي المرجعي للحصول على النتائج الأكثر أمانًا.

format.setInt32(KEY_PROFILE, AVCProfileBaseline);

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

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

استخدام وحدة التحويل لتحويل ترميز النطاق العالي الديناميكية إلى النطاق العادي الديناميكية (SDR)

بدءًا من نظام التشغيل Android 13 (المستوى 33 لواجهة برمجة التطبيقات)، ننصحك باستخدام وحدة Transformer في Jetpack Media3 لمشاركة محتوى النطاق العالي الديناميكية مع التطبيقات والخدمات والأجهزة التي لا تتوافق مع النطاق العالي الديناميكية. تعمل وحدة التحويل من خلال تعيين تدرج الفيديو المضمّن بنطاق عالي الديناميكية على النطاق العادي وحفظ النتيجة بتنسيق MP4، ما يتيح تشغيل المحتوى بنجاح بدون فقدان التفاصيل أو سطوع الصورة.

ملاحظة: تعمل وحدة Transformer بشكل مختلف على الأجهزة التي تستهدف إصدارات النظام بدءًا من Android 12 (المستوى 32 لواجهة برمجة التطبيقات) وصولاً إلى Android 7.0 (المستوى 24 لواجهة برمجة التطبيقات). إذا كان الجهاز متوافقًا مع تقنية HDR، سيشغِّل التطبيق المحتوى بدون ضبط الدرجات اللونية. إذا كان الجهاز لا يتوافق مع تقنية HDR، ستظهر رسالة خطأ تشير إلى أنّ تقنية تعيين النغمات بنطاق عالي الديناميكية غير متاحة.

تقوم التعليمة البرمجية التالية بإعداد محول يعين نغمة الإدخال إلى SDR ويعيد ترميزه بتنسيق الإدخال (مثل H.264/AVC):

Kotlin

val transformer = Transformer.Builder(context)
    .setTransformationRequest(
        TransformationRequest.Builder()
            .setHdrMode(TransformationRequest.HDR_MODE_TONE_MAP_HDR_TO_SDR)
            .build())
    .addListener(/* ... */)
    .build()

Java

Transformer transformer = new Transformer.Builder(context)
    .setTransformationRequest(
        new TransformationRequest.Builder()
            .setHdrMode(TransformationRequest.HDR_MODE_TONE_MAP_HDR_TO_SDR)
            .build())
    .addListener(/* ... */)
    .build();

لتجربة وظيفة تعيين الدرجات اللونية، اطّلع على تطبيق Transformer التجريبي.

يمكنك أيضًا إعداد عملية ربط الدرجات اللونية باستخدام MediaCodec، إلا أنّ عملية التنفيذ تكون أكثر تعقيدًا. لمزيد من المعلومات، يمكنك الاطّلاع على المستندات المرجعية MediaCodec.