WebRTC على Android: كيفية تمكين ترميز الأجهزة على أجهزة متعددة

لمكالمات الفيديو في Badoo ، نستخدم معيار WebRTC وبرنامج الترميز H.264. إذا كنت تعتقد أن الوثائق ، يجب أن يعمل برنامج الترميز هذا دون مشاكل على أي جهاز Android منذ Android 5.0. ولكن في الواقع ، تبين أن كل شيء ليس كذلك. في هذه المقالة ، سأتحدث عن ميزات تنفيذ ترميز الأجهزة لبرنامج الترميز H.264 في WebRTC وكيفية جعله يعمل على المزيد من الأجهزة.



لماذا H.264؟


عند الاتصال عبر WebRTC ، ترسل جميع الأجهزة المشاركة في الجلسة معلمات اتصال متنوعة ، بما في ذلك برامج ترميز الفيديو والصوت. إذا كانت الأجهزة تدعم برامج ترميز متعددة (على سبيل المثال ، VP8 و H.264) ، يتم سرد برامج الترميز ذات الأولوية للنظام الأساسي أولاً. يتم استخدام هذه البيانات في مرحلة التسوية في WebRTC ، وبعدها فقط تبقى برامج الترميز التي تدعمها جميع الأجهزة. يمكن رؤية مثال على هذه البيانات مع فك التشفير في هذا المستند .

في حالة مكالمات الفيديو ، إذا كان أحد الأجهزة لا يدعم برنامج الترميز H.264 ، يمكن لكلا الجهازين التبديل ، على سبيل المثال ، إلى برنامج الترميز VP8 ، والذي لا يعتمد على تنفيذ الأجهزة على الجهاز. لكن تطبيقنا متاح على مجموعة متنوعة من الأدوات ، بما في ذلك الهواتف الذكية من الأجيال السابقة. لذلك ، بالنسبة لاتصالات الفيديو ، أردنا استخدام ترميز الأجهزة كلما أمكن ذلك: فهو يقلل من الحمل على المعالج ولا يأكل البطارية كثيرًا ، وهو أمر مهم للأجهزة القديمة. يتم تنفيذ دعم ترميز الأجهزة H.264 على عدد كبير من الأجهزة ، على عكس VP8 نفسه .

دعم H.264 على Android


إذا كنت تعتقد أن وصف دعم تنسيقات الوسائط المتعددة ، يجب أن يعمل فك ترميز H.264 Baseline Profile على جميع أجهزة Android ، والتشفير - بدءًا من Android 3.0. في Badoo ، ندعم الأجهزة التي تبدأ بنظام Android 5.0 ، لذلك لا يجب أن نواجه أي مشاكل. لكن الأمر لم يكن بهذه البساطة: حتى في الأدوات ذات الإصدار الخامس ، وجدنا عددًا كبيرًا من الميزات.

مع ما يمكن توصيله؟

كما تعلم ، عند تطوير جهاز جديد على Android ، يحتاج أي مصنع إلى اجتياز Compatibility Test Suite. يتم تشغيله على جهاز كمبيوتر متصل بالجهاز ، ويجب إرسال نتائجه إلى Google للتأكد من أن الجهاز يلبي متطلبات نظام التشغيل Android للإصدار المحدد. فقط بعد ذلك يمكن تحرير الأداة إلى السوق.

نحن مهتمون باختبارات الوسائط المتعددة في مجموعة الاختبارات هذه ، وبشكل أكثر تحديدًا ، اختبارات ترميز الفيديو وفك التشفير. قررت أن أتطرق إلى الاختبارات EncodeDecodeTest و MediaCodecTest و DecoderTest و EncoderTest ، نظرًا لأنها موجودة في جميع إصدارات Android منذ 4.3. يبدو الرسم البياني لعدد أسطر التعليمات البرمجية في هذه الاختبارات كما يلي:



قبل الإصدار 4.3 ، لم تكن معظم هذه الاختبارات موجودة ببساطة ، وانخفضت زيادة كبيرة في الإصدارين 5 و 7. لذلك ، يمكننا القول أنه قبل الإصدار Android 4.3 لم تتحقق Google من امتثال الأجهزة لمواصفاتها لترميز وفك ترميز الفيديو ، ولكن في الإصدار 5.0 تحسين هذا الاختيار بشكل كبير.

يبدو أن هذا يشير إلى أنه بدءًا من الإصدار 5.0 بترميز كل شيء يجب أن يكون بالترتيب. ولكن ، نظرًا لتجربتي السابقة في فك تشفير بث الفيديو على Android ، كنت متأكدًا من أنه ليس كذلك. كان يكفي إلقاء نظرة على عدد المواضيع حول الترميز في مناقشة مجموعة Google -webrtc .

ساعدتنا ملفات مصدر WebRTC ، الموجودة في المجال العام ، في البحث عن المزالق. دعونا ننظر فيها بمزيد من التفصيل.

دعم H.264 في WebRTC


لنبدأ مع HardwareVideoEncoderFactory .

هناك طريقة باسم التحدث هو HardwareSupportedInCurrentSdkH264:

private boolean isHardwareSupportedInCurrentSdkH264(MediaCodecInfo info) {
  // First, H264 hardware might perform poorly on this model.
  if (H264_HW_EXCEPTION_MODELS.contains(Build.MODEL)) {
    return false;
  }
  String name = info.getName();
  // QCOM H264 encoder is supported in KITKAT or later.
  return (name.startsWith(QCOM_PREFIX) && Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT)
      // Exynos H264 encoder is supported in LOLLIPOP or later.
      || (name.startsWith(EXYNOS_PREFIX)
             && Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP);
}

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

يتم تخزين جميع أوصاف برنامج الترميز على الجهاز في ملف media_codecs.xml. هنا ، على سبيل المثال ، هذا الملف لهاتف Pixel XL و HUAWEI P8 lite . عندما تحصل على قائمة ببرامج الترميز باستخدام طريقة getCodecInfos () للكائن MediaCodecList ، يتم تحليل هذا الملف - ويتم إرجاع برامج الترميز المخزنة فيه. يتم تغطية هذه العملية والتعبئة الصحيحة لهذا الملف من قبل الشركة المصنعة في اختبار CTS.MediaCodecListTest ، التي زادت أيضًا من 160 سطرًا من التعليمات البرمجية في Android 4.3 إلى 740 سطرًا في Android 10.

في Badoo ، قمنا بتغيير رمز الطريقة isHardwareSupportedInCurrentSdkH264 ، ورفض قائمة الترميز "البيضاء" واستبدالها بقائمة "سوداء" من بادئات برنامج الترميز المدرجة في WebRTC:

static final String[] SOFTWARE_IMPLEMENTATION_PREFIXES = {"OMX.google.", "OMX.SEC."};

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

خيارات تكوين برنامج الترميز


تهيئة برنامج الترميز للترميز كما يلي:

MediaCodec mediaCodec = createByCodecName(codecName);
MediaFormat format = MediaFormat.createVideoFormat(mime, width, height);
format.setInteger(MediaFormat.KEY_BIT_RATE, targetBitrateBps);
format.setInteger(MediaFormat.KEY_BITRATE_MODE, VIDEO_ControlRateConstant);
format.setInteger(MediaFormat.KEY_COLOR_FORMAT, colorFormat);
format.setInteger(MediaFormat.KEY_FRAME_RATE, targetFps);
format.setInteger(MediaFormat.KEY_I_FRAME_INTERVAL, keyFrameIntervalSec);
mediaCodec.configure(format, null, null, MediaCodec.CONFIGURE_FLAG_ENCODE);

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


وفقًا لذلك ، لكل برنامج ترميز ، يجب عليك اختيار آلية ضبط معدل البت الخاصة بك. دعنا نفكر بمزيد من التفصيل في ميزات تعيين معلمات التهيئة لترميزات الأجهزة.

دقة البث


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

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

وضع معدل البت


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

format.setInteger(MediaFormat.KEY_BITRATE_MODE, VIDEO_ControlRateVariable);

حدث هذا على جهاز Lenovo A1000 مع مجموعة شرائح Spreadtrum (الآن Unisoc) بدءًا بالبادئة "OMX.sprd". بحث على شبكة الإنترنت أدى بنا إلى عمرها ست سنوات آخر على فايرفوكس OS الذي يصف هذه المشكلة وكيفية حلها.

تنسيق الألوان


عند استخدام برنامج الترميز في وضع المخزن المؤقت للبايت ، يجب تحديد التنسيق الصحيح. يتم ذلك عادةً باستخدام دالة من النموذج التالي:

@Nullable
static Integer selectColorFormat(int[] supportedColorFormats, CodecCapabilities capabilities) {
  for (int supportedColorFormat : supportedColorFormats) {
    for (int codecColorFormat : capabilities.colorFormats) {
      if (codecColorFormat == supportedColorFormat) {
        return codecColorFormat;
      }
    }
  }
  return null;
}

بشكل تقريبي ، يتم تحديد أول تنسيقات الألوان المدعومة دائمًا.

ومع ذلك ، في حالة برامج ترميز HUAWEI التي تبدأ بالبادئات "OMX.IMG.TOPAZ." ، "OMX.hisi". و "OMX.k3." ، لم يفلح ذلك ، وبعد بحث طويل وجدنا حلًا: بغض النظر عن التنسيق الذي تعرضه برامج الترميز هذه ، يلزمك استخدام تنسيق COLOR_FormatYUV420SemiPlanar . ساعدنا الخيط على معرفة ذلك في منتدى صيني واحد.

تعديل البتات


يحتوي كود WebRTC القياسي على ما يلي :

private BitrateAdjuster createBitrateAdjuster(VideoCodecMimeType type, String codecName) {
  if (codecName.startsWith(EXYNOS_PREFIX)) {
    if (type == VideoCodecMimeType.VP8) {
        // Exynos VP8 encoders need dynamic bitrate adjustment.
        return new DynamicBitrateAdjuster();
      } else {
        // Exynos VP9 and H264 encoders need framerate-based bitrate adjustment.
        return new FramerateBitrateAdjuster();
    }
  }
  // Other codecs don't need bitrate adjustment.
  return new BaseBitrateAdjuster();
}

كما ترى من هذا الكود ، لجميع الشرائح باستثناء Exynos ، يتم إيقاف تعديل معدل البت. لكن هذا ينطبق فقط على Qualcomm ، حيث يتم دعم Exynos و Qualcomm فقط في الكود القياسي. من خلال تجربة القيم المختلفة لهذا الإعداد ، بالإضافة إلى البحث في الإنترنت ، اكتشفنا أنه بالنسبة إلى برامج الترميز ذات البادئات "OMX.MTK". يجب أيضًا تشغيله. من الضروري أيضًا القيام بذلك مع برامج ترميز HUAWEI التي تبدأ بالبادئة "OMX.IMG.TOPAZ." ، "OMX.hisi". أو "OMX.k3.". ويرجع ذلك إلى حقيقة أن برامج الترميز هذه لا تستخدم الطوابع الزمنية للإطارات لضبط معدل البت ، على افتراض أن جميع الإطارات تأتي بنفس مجموعة التردد عند تكوين برنامج الترميز.

في الختام ، سأقدم قائمة من برامج الترميز التي استلمناها للأجهزة التي تعمل بنظام Android 5.0 و 5.1. لقد كانت تهمنا في المقام الأول لأنه في الإصدارات الأحدث من Android ، يتحسن الوضع وأصبحت برامج الترميز غير القياسية أصغر.

هذا يمكن رؤيته في الرسم البياني أدناه. المقياس اللوغاريتمي لإظهار الحالات النادرة بشكل أفضل.


كما نرى ، كانت معظم الأجهزة تحتوي على شرائح Spreadtrum و MediaTek و HUAWEI و MARVELL - لذا ساعدت تغييراتنا في تشغيل ترميز الأجهزة على هذه الأدوات.

نتيجة


على الرغم من أننا افترضنا أن بعض الأجهزة ستواجه مشاكل في العمل مع H.264 ، تمكن Android مرة أخرى من مفاجأتنا. كما نرى من إحصائيات مستخدمي Badoo ، لا يزال هناك عدد غير قليل من الأجهزة في أيدي المستخدمين في 2014-2016 ، والتي لا يريدونها أو لا يمكنهم تحديثها. وعلى الرغم من أن الوضع مع إصدار تحديثات Android للأجهزة الجديدة هو بالفعل أفضل بكثير مما كان عليه قبل بضع سنوات ، فإن حصة أدوات الجيل السابق تتناقص ببطء شديد ويجب الحفاظ عليها لبعض الوقت.

يتم الآن تطوير WebRTC بنشاط بواسطة Google نظرًا لاستخدامه في مشروع Stadia (إليك الفيديومع تفاصيل حول هذا الموضوع) ، لذلك سيصبح أفضل وأفضل ، وعلى الأرجح ، سيصبح المعيار لتنفيذ اتصالات الفيديو. آمل أن تساعدك هذه المقالة على فهم ميزات العمل مع H.264 في WebRTC واستخدامها في مشاريعك.

All Articles