بيانات برنامج الوسائط الشائعة (CMCD)

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

ويعتمد التنفيذ في ExoPlayer على المواصفات المحددة في CTA-5004:

إتاحة استخدام CMCD في Exoplayer

لا يمكن تفعيل دعم CMCD في ExoPlayer إلا لتنسيقات البث التكيُّفية. مثل DASH وHLS وSmoothStreaming.

مفاتيح بيانات CMCD

يتم تصنيف مفاتيح بيانات CMCD إلى أربعة أنواع مختلفة:

  • CMCD-Request: مفاتيح تختلف قيمها باختلاف كل طلب.
  • CMCD-Object: مفاتيح تختلف قيمها حسب الكائن المطلوب.
  • CMCD-Status: مفاتيح لا تختلف قيمها باختلاف كل طلب أو كائن.
  • جلسة CMCD: المفاتيح التي يُتوقّع أن تكون قيمها ثابتة خلال فترة الجلسة.

أوضاع نقل البيانات

يمكن إرسال بيانات CMCD باستخدام إحدى الطريقتين التاليتين:

  • هذا العنوان هو عنوان طلب HTTP مخصّص، وهو السلوك التلقائي.
  • كوسيطة طلب بحث HTTP.

تفعيل بروتوكول CMCD

لتفعيل ميزة CMCD، يجب إنشاء مثيل لـ CmcdConfiguration.Factory. وتمريره إلى MediaSource.Factory الذي يُستخدَم عند إنشاء لاعب. يمكنك إما استخدام CmcdConfiguration.Factory التلقائي أو تقديم مصنعك المخصّص الذي يتم تسميته في كل مرة يتم فيها إنشاء مصدر وسائط تكيُّفي التي تم إنشاؤها لعنصر الوسائط المحدّد.

تفعيل CMCD مع المصنع التلقائي للإعدادات

Kotlin

// Create media source factory and set default cmcdConfigurationFactory.
val mediaSourceFactory =
    DefaultMediaSourceFactory(context)
        .setCmcdConfigurationFactory(CmcdConfiguration.Factory.DEFAULT)

Java

// Create media source factory and set default cmcdConfigurationFactory.
MediaSource.Factory mediaSourceFactory =
    new DefaultMediaSourceFactory(context)
        .setCmcdConfigurationFactory(CmcdConfiguration.Factory.DEFAULT);

تفعيل CMCD مع الشركة المصنِّعة للإعدادات المخصّصة

Kotlin

val cmcdConfigurationFactory = object : CmcdConfiguration.Factory {
    override fun createCmcdConfiguration(mediaItem: MediaItem): CmcdConfiguration {
        val cmcdRequestConfig = object : CmcdConfiguration.RequestConfig {
            override fun isKeyAllowed(key: String): Boolean {
                return key == "br" || key == "bl"
            }

            override fun getCustomData(): ImmutableListMultimap<@CmcdConfiguration.HeaderKey String, String> {
                return ImmutableListMultimap.of(
                    CmcdConfiguration.KEY_CMCD_OBJECT, "key1=stringValue")
            }

            override fun getRequestedMaximumThroughputKbps(throughputKbps: Int): Int {
                return 5 * throughputKbps
            }
        }

        val sessionId = UUID.randomUUID().toString()
        val contentId = UUID.randomUUID().toString()

        return CmcdConfiguration(sessionId, contentId, cmcdRequestConfig, MODE_QUERY_PARAMETER)
    }
}

// Create media source factory and set your custom cmcdConfigurationFactory.
val mediaSourceFactory =
    DefaultMediaSourceFactory(context)
        .setCmcdConfigurationFactory(cmcdConfigurationFactory)

Java

CmcdConfiguration.Factory cmcdConfigurationFactory = mediaItem -> {
  CmcdConfiguration.RequestConfig cmcdRequestConfig = new CmcdConfiguration.RequestConfig() {
    @Override
    public boolean isKeyAllowed(String key) {
      return key.equals("br") || key.equals("bl");
    }

    @Override
    public ImmutableListMultimap<@HeaderKey String, String> getCustomData() {
      return ImmutableListMultimap.of(
          CmcdConfiguration.KEY_CMCD_OBJECT, "key1=stringValue");
    }

    @Override
    public int getRequestedMaximumThroughputKbps(int throughputKbps) {
      return 5 * throughputKbps;
    }
  };

  String sessionId = UUID.randomUUID().toString();
  String contentId = UUID.randomUUID().toString();

  return new CmcdConfiguration(sessionId, contentId, cmcdRequestConfig, MODE_QUERY_PARAMETER);
};

// Create media source factory and set your custom cmcdConfigurationFactory.
MediaSource.Factory mediaSourceFactory =
    new DefaultMediaSourceFactory(context)
        .setCmcdConfigurationFactory(cmcdConfigurationFactory);

أمثلة على بيانات CMCD

توضّح هذه الأمثلة مجموعات البيانات الصالحة التي تم إرسالها عند استرجاعها. مقاطع الوسائط:

  • كرؤوس طلبات HTTP مخصصة

       CMCD-Session:sid="6e2fb550-c457-11e9-bb97-0800200c9a66"
    
       CMCD-Request:mtp=25400 CMCD-Object:br=3200,d=4004,ot=v,tb=6000
       CMCD-Status:bs,rtp=15000
       CMCD-Session:sid="6e2fb550-c457-11e9-bb97-0800200c9a66"
    
  • كوسيطات طلب بحث HTTP

       ?CMCD=sid%3D%226e2fb550-c457-11e9-bb97-0800200c9a66%22
    
       ?CMCD=br%3D3200%2Cbs%2Cd%3D4004%2Cmtp%3D25400%2Cot%3Dv%2Crtp
       %3D15000%2Csid%3D%226e2fb550-c457-11e9-bb97-
       0800200c9a66%22%2Ctb%3D6000