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

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

يستند التنفيذ في ExoPlayer إلى المواصفات المحدّدة في CTA-5004.

توافق CMCD مع ExoPlayer

لا يمكن تفعيل توافق CMCD في ExoPlayer إلا مع صيغ البث التكيّفي، مثل DASH وHLS وSmoothStreaming.

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

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

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

طُرق نقل البيانات

يمكن إرسال بيانات 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