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

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

پیاده‌سازی در ExoPlayer بر اساس مشخصات تعریف‌شده در CTA-5004 است.

پشتیبانی از CMCD در Exoplayer

پشتیبانی از CMCD در ExoPlayer فقط برای قالب‌های پخش تطبیقی ​​مانند DASH ، HLS و SmoothStreaming قابل فعال‌سازی است.

کلیدهای داده CMCD

کلیدهای داده CMCD به چهار نوع مجزا طبقه‌بندی می‌شوند:

  • CMCD-Request : کلیدهایی که مقادیر آنها با هر درخواست تغییر می‌کند.
  • CMCD-Object : کلیدهایی که مقادیر آنها با توجه به شیء درخواستی متفاوت است.
  • CMCD-Status : کلیدهایی که مقادیر آنها با هر درخواست یا شیء تغییر نمی‌کند.
  • CMCD-Session : کلیدهایی که انتظار می‌رود مقادیر آنها در طول دوره session ثابت باشد.

روش‌های انتقال داده

داده‌های CMCD را می‌توان با استفاده از یکی از دو روش زیر منتقل کرد:

  • به عنوان یک هدر درخواست HTTP سفارشی، که رفتار پیش‌فرض است.
  • به عنوان یک آرگومان پرس و جوی HTTP.

فعال کردن CMCD

برای فعال کردن CMCD، باید یک نمونه از CmcdConfiguration.Factory ایجاد کنید و آن را به MediaSource.Factory که هنگام ساخت پخش‌کننده استفاده می‌شود، منتقل کنید. می‌توانید از CmcdConfiguration.Factory پیش‌فرض استفاده کنید یا 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