Datos comunes de clientes multimedia (CMCD)

Los clientes de reproductores multimedia pueden transmitir información valiosa a las redes de distribución de contenidos (CDN) con cada solicitud de objeto. La transmisión de esos datos puede mejorar la supervisión de la QoS, la optimización del tráfico adaptable 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 de 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 las claves cuyos valores varían con cada solicitud.
  • CMCD-Object: Claves cuyos valores varían con el objeto que se solicita.
  • CMCD-Status: Claves cuyos valores no varían con cada solicitud o cada objeto.
  • CMCD-Session: Claves cuyos valores se espera que sean invariantes durante la duración de la sesión.

Modos de transmisión de datos

Los datos CMCD se pueden transmitir usando uno de 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 a 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 multimedia adaptable para el elemento multimedia determinado.

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

Habilita CMCD con una 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 los siguientes ejemplos, se muestran combinaciones de datos válidas de datos enviados 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