Datos comunes de clientes multimedia (CMCD)

Los clientes de reproductores multimedia pueden transmitir información valiosa a las redes de distribución de contenido (CDN) con cada solicitud de objeto. La transmisión de esos datos puede mejorar la supervisión de la QoS, la optimización adaptativa del tráfico y el rendimiento de la entrega, lo que, en última instancia, mejora la experiencia del consumidor.

La implementación en ExoPlayer se basa en la especificación definida en CTA-5004.

Compatibilidad con CMCD en ExoPlayer

La compatibilidad con CMCD en ExoPlayer solo se puede habilitar para formatos de transmisión adaptables, como DASH, HLS y SmoothStreaming.

Claves de datos de CMCD

Las claves de datos de CMCD se clasifican en cuatro tipos distintos:

  • CMCD-Request: Son claves cuyos valores varían con cada solicitud.
  • CMCD-Object: Son claves cuyos valores varían según el objeto que se solicita.
  • CMCD-Status: Son claves cuyos valores no varían con cada solicitud u objeto.
  • CMCD-Session: Son claves cuyos valores se espera que sean invariables durante la vida útil de la sesión.

Modos de transmisión de datos

Los datos de CMCD se pueden transmitir con uno de los siguientes métodos:

  • Como encabezado de solicitud HTTP personalizado, que es el comportamiento predeterminado.
  • Como argumento de consulta HTTP

Habilita CMCD

Para habilitar CMCD, debes crear una instancia de CmcdConfiguration.Factory y pasarla a MediaSource.Factory, que se usa cuando se compila el reproductor. Puedes usar el CmcdConfiguration.Factory predeterminado o proporcionar tu propia fábrica personalizada, que se llama cada vez que se crea una fuente de medios adaptable para el elemento multimedia determinado.

Habilita CMCD con el factor de configuración predeterminado

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

Habilita CMCD con un factor de configuración personalizado

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

Ejemplos de datos de CMCD

En estos ejemplos, se ilustran combinaciones de datos válidas que se envían cuando se recuperan fragmentos de medios:

  • Como encabezados de solicitud 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