Dati Common Media Client (CMCD)

I client del lettore multimediale possono trasmettere informazioni preziose alle Content Delivery Network (CDN) con ogni richiesta di oggetto. La trasmissione di questi dati può migliorare il monitoraggio della QoS, l'ottimizzazione adattiva del traffico e il rendimento della distribuzione, migliorando in definitiva l'esperienza dei consumatori.

L'implementazione in ExoPlayer si basa sulla specifica definita in CTA-5004.

Supporto di CMCD in ExoPlayer

Il supporto di CMCD in ExoPlayer può essere attivato solo per i formati di streaming adattivo, come DASH, HLS e SmoothStreaming.

Chiavi dati CMCD

Le chiavi dei dati CMCD sono classificate in quattro tipi distinti:

  • CMCD-Request: chiavi i cui valori variano a ogni richiesta.
  • CMCD-Object: chiavi i cui valori variano in base all'oggetto richiesto.
  • CMCD-Status: chiavi i cui valori non variano a ogni richiesta o oggetto.
  • CMCD-Session: chiavi i cui valori dovrebbero rimanere invariati per tutta la durata della sessione.

Modalità di trasmissione dei dati

I dati CMCD possono essere trasmessi utilizzando uno dei due metodi seguenti:

  • Come intestazione della richiesta HTTP personalizzata, che è il comportamento predefinito.
  • Come argomento della query HTTP.

Abilitare CMCD

Per attivare CMCD, devi creare un'istanza di CmcdConfiguration.Factory e passarla a MediaSource.Factory, che viene utilizzato durante la creazione del player. Puoi utilizzare CmcdConfiguration.Factory predefinito o fornire la tua fabbrica personalizzata, che viene chiamata ogni volta che viene creata un'origine media adattiva per l'elemento multimediale specificato.

Abilita CMCD con la configurazione predefinita di fabbrica

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

Abilita CMCD con factory di configurazione personalizzata

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

Esempi di dati CMCD

Questi esempi illustrano combinazioni di dati valide inviate durante il recupero dei blocchi multimediali:

  • Come intestazioni delle richieste HTTP personalizzate

       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"
    
  • Come argomenti della query 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