Common Media Client Data (CMCD)

媒體播放器用戶端可以將寶貴資訊傳送至內容上傳 每個物件要求使用的網路 (CDN)。傳輸資料有助於提升 QoS 品質 並自動調整流量最佳化和推送成效 如何提升消費者體驗

ExoPlayer 中的實作是以 CTA-5004

Exoplayer 的 CMCD 支援功能

只有 ExoPlayer 能為自動調整串流格式啟用 CMCD 支援功能, 例如 DASHHLSSmoothStreaming

CMCD 資料索引鍵

CMCD 資料鍵可分為四種類型:

  • CMCD-Request:值因每個要求而異的鍵。
  • CMCD-Object:值與要求物件的值不同的鍵。
  • CMCD-Status:值不隨著每個要求或物件而異的鍵。
  • CMCD-Session:此鍵的值預期在 整個學習路徑

資料傳輸模式

CMCD 資料可透過以下其中一種方式傳輸:

  • 做為自訂 HTTP 要求標頭,也就是 default 行為。
  • 做為 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