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

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

يستند التنفيذ في 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