媒體播放器用戶端可以透過每個物件要求,將實用資訊傳送至內容傳遞聯播網 (CDN)。傳送這些資料可提高 QoS 監控、自動調整流量最佳化和推送效能,進而改善消費者體驗。
ExoPlayer 中的實作是以 CTA-5004 定義的規格為基礎。
Exoplayer 中的 CMCD 支援
只有自動調整串流格式 (例如 DASH、HLS 和 SmoothStreaming) 才能啟用 ExoPlayer 的 CMCD 支援功能。
CMCD 資料鍵
CMCD 資料鍵分為四種類型:
- CMCD-Request:其值會因每項要求而有所不同。
- CMCD-Object:其值與要求物件的鍵不同。
- CMCD-Status:其值不會隨著每個要求或物件而改變的鍵。
- 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