داده های مشترک رسانه مشتری (CMCD)

کلاینت های پخش کننده رسانه می توانند با هر درخواست شی اطلاعات ارزشمندی را به شبکه های تحویل محتوا (CDN) منتقل کنند. انتقال این داده ها می تواند نظارت QoS، بهینه سازی ترافیک تطبیقی ​​و عملکرد تحویل را بهبود بخشد و در نهایت تجربه مصرف کننده را افزایش دهد.

پیاده سازی در 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 را با تنظیمات کارخانه پیش فرض فعال کنید

کاتلین

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

جاوا

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

CMCD را با تنظیمات کارخانه سفارشی فعال کنید

کاتلین

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)

جاوا

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