Dados comuns do cliente de mídia (CMCD, na sigla em inglês)

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

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);

Ativar CMCD com fábrica de configuração personalizada

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);

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