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. Transmitir esos datos puede mejorar la supervisión de la QoS, la optimización del tráfico adaptable y el rendimiento de la publicación, 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: Claves cuyos valores varían según el objeto que se solicita.
  • CMCD-Status: Son claves cuyos valores no varían con cada solicitud o objeto.
  • CMCD-Session: Claves cuyos valores se espera que no cambien durante la vida de la sesión.

Modos de transmisión de datos

Los datos de CMCD se pueden transmitir usando uno de estos dos métodos:

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

Habilita CMCD

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

Habilita CMCD con la fábrica de configuración predeterminada

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

Habilitar CMCD con la fábrica de configuración 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);

Ejemplos de datos de CMCD

En estos ejemplos, se muestran combinaciones de datos válidas de los datos que se envían cuando se recuperan fragmentos de contenido multimedia:

  • 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