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

Os clientes de players de mídia podem transmitir informações valiosas para as redes de fornecimento de conteúdo (CDNs, na sigla em inglês) 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 da entrega, aprimorando a experiência do consumidor.

A implementação no ExoPlayer é baseada na especificação definida na CTA-5004 (link em inglês).

Compatibilidade com 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 CMCD

As chaves de dados CMCD são classificadas em quatro tipos distintos:

  • CMCD-Request: chaves com valores que variam de acordo com cada solicitação.
  • CMCD-Object: chaves com valores que variam de acordo com o objeto solicitado.
  • CMCD-Status: chaves com valores que não variam a cada solicitação ou objeto.
  • CMCD-Session: chaves com valores que precisam ser invariantes ao longo da vida útil da sessão.

Modos de transmissão de dados

Os dados CMCD podem ser transmitidos usando um destes dois métodos:

  • 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. É possível usar a CmcdConfiguration.Factory padrão ou fornecer sua própria fábrica personalizada, que é chamada toda vez que uma fonte de mídia adaptável é criada para o item de mídia especificado.

Ativar CMCD com 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 de CMCD

Estes exemplos ilustram combinações válidas de dados enviados ao buscar blocos 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 da 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