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 redes de fornecimento de conteúdo (CDNs) com cada solicitação de objeto. A transmissão desses dados pode melhorar o monitoramento da qualidade de serviço, a otimização adaptativa do tráfego e a performance de entrega, aprimorando a experiência do consumidor.

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

Suporte a CMCD no Exoplayer

O suporte a CMCD no ExoPlayer só pode ser ativado para formatos de streaming adaptáveis, como DASH, HLS e SmoothStreaming.

Chaves de dados da CMCD

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

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

Modos de transmissão de dados

Os dados de 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 a CMCD, crie uma instância de CmcdConfiguration.Factory e transmita-a 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 específico.

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

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