Os clientes do media player podem transmitir informações valiosas para redes de entrega de conteúdo (CDNs) com cada solicitação de objeto. A transmissão desses dados pode melhorar o monitoramento de QoS, a otimização de tráfego adaptável e o desempenho de entrega, melhorando a experiência do consumidor.
A implementação no ExoPlayer é baseada na especificação definida em CTA-5004.
Suporte a CMCD no Exoplayer
A compatibilidade com CMCD no ExoPlayer só pode ser ativada para formatos de streaming adaptáveis, como DASH, HLS e SmoothStreaming.
Chaves de dados do CMCD
As chaves de dados CMCD são classificadas em quatro tipos distintos:
- CMCD-Request: chaves com valores que variam de acordo com a solicitação.
- CMCD-Object: chaves com valores que variam de acordo com o objeto solicitado.
- CMCD-Status: chaves cujos valores não variam com cada solicitação ou objeto.
- CMCD-Session: chaves cujos valores devem ser invariáveis durante a sessão.
Modos de transmissão de dados
Os dados do CMCD podem ser transmitidos de duas maneiras:
- Como um cabeçalho de solicitação HTTP personalizado, que é o comportamento padrão.
- Como um argumento de consulta HTTP.
Ativar CMCD
Para ativar o CMCD, é necessário criar uma instância do CmcdConfiguration.Factory
e transmiti-la para o MediaSource.Factory
, que é usado ao criar o
player. Você pode usar o CmcdConfiguration.Factory
padrão ou fornecer
sua própria fábrica personalizada, que é chamada sempre que uma fonte de mídia adaptativa é
criada para o item de mídia especificado.
Ativar o CMCD com a fábrica de configuração padrão
// 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);
Ativar CMCD com fábrica de configuração personalizada
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);
Exemplos de dados CMCD
Esses exemplos ilustram combinações válidas de dados enviados ao buscar fragmentos de mídia:
Como cabeçalhos de solicitação HTTP personalizados
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"Como argumentos de consulta 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