媒体播放器客户端可以向内容传送传输有价值的信息 包含每个对象请求的广告网络 (CDN)。传输这些数据可以改善服务质量 (QoS) 监控、自适应流量优化和交付性能, 从而改善消费者体验
ExoPlayer 中的实现基于 CTA-5004。
Exoplayer 中的 CMCD 支持
ExoPlayer 中的 CMCD 支持只能为自适应流式传输格式启用, 例如 DASH、HLS 和 SmoothStreaming。
CMCD 数据键
CMCD 数据键分为四种不同的类型:
- CMCD-Request:其值随每个请求而变化的键。
- CMCD-Object:其值会因请求的对象而异的键。
- CMCD-Status:这些键的值不会随每个请求或对象而变化。
- CMCD-Session:这些键的值预计会保持不变的 会话的整个生命周期
数据传输模式
可使用以下两种方法之一传输 CMCD 数据:
- 作为自定义 HTTP 请求标头,这是默认行为。
- 作为 HTTP 查询参数。
启用 CMCD
如需启用 CMCD,您需要创建一个“CmcdConfiguration.Factory
”实例
并将其传递给MediaSource.Factory
,在构建
播放器。您可以使用默认的 CmcdConfiguration.Factory
,也可以提供
您自己的自定义工厂(每次加载自适应媒体来源时调用)
为给定媒体项创建的任何 ID。
使用默认配置出厂设置启用 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