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

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

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

دعم CMCD في Exoمشغّل

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

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

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

  • CMCD-Request: المفاتيح التي تختلف قيمها باختلاف كل طلب.
  • CMCD-Object: المفاتيح التي تختلف قيمها عن العنصر المطلوب.
  • حالة CMCD: المفاتيح التي لا تختلف قيمها في كل طلب أو عنصر.
  • 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