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

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

پیاده‌سازی در 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