CMCD (Common Media Client Data)

Les clients de lecteur multimédia peuvent transmettre des informations précieuses aux réseaux de diffusion de contenu (CDN) à chaque requête d'objet. La transmission de ces données peut améliorer la surveillance de la qualité de service, l'optimisation adaptative du trafic et les performances de diffusion, ce qui améliore en fin de compte l'expérience des consommateurs.

L'implémentation dans ExoPlayer est basée sur la spécification définie dans CTA-5004.

Compatibilité avec CMCD dans ExoPlayer

La prise en charge de CMCD dans ExoPlayer ne peut être activée que pour les formats de streaming adaptatif, tels que DASH, HLS et SmoothStreaming.

Clés de données CMCD

Les clés de données CMCD sont classées en quatre types distincts :

  • CMCD-Request : clés dont les valeurs varient à chaque requête.
  • CMCD-Object : clés dont les valeurs varient en fonction de l'objet demandé.
  • CMCD-Status : clés dont les valeurs ne varient pas à chaque requête ou objet.
  • CMCD-Session : clés dont les valeurs sont censées être invariantes pendant toute la durée de la session.

Modes de transmission des données

Les données CMCD peuvent être transmises de deux manières :

  • En tant qu'en-tête de requête HTTP personnalisé, qui est le comportement par défaut.
  • En tant qu'argument de requête HTTP.

Activer CMCD

Pour activer CMCD, vous devez créer une instance de CmcdConfiguration.Factory et la transmettre à MediaSource.Factory, qui est utilisé lors de la création du lecteur. Vous pouvez utiliser le CmcdConfiguration.Factory par défaut ou fournir votre propre fabrique personnalisée, qui est appelée chaque fois qu'une source média adaptative est créée pour l'élément multimédia donné.

Activer CMCD avec la fabrique de configuration par défaut

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

Activer CMCD avec une fabrique de configuration personnalisée

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

Exemples de données CMCD

Ces exemples illustrent des combinaisons de données valides envoyées lors de la récupération de blocs de contenu multimédia :

  • En tant qu'en-têtes de requête HTTP personnalisés

       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"
    
  • En tant qu'arguments de requête 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