Common Media Client Data (CMCD)

Mediaplayer-Clients können mit jeder Objektanfrage wertvolle Informationen an Content Delivery Networks (CDNs) übertragen. Durch die Übertragung dieser Daten können die Dienstqualität, die adaptive Traffic-Optimierung und die Bereitstellungsleistung verbessert werden, was letztendlich das Kundenerlebnis verbessert.

Die Implementierung in ExoPlayer basiert auf der in CTA-5004 definierten Spezifikation.

CMCD-Unterstützung in Exoplayer

Die CMCD-Unterstützung in ExoPlayer kann nur für adaptive Streamingformate wie DASH, HLS und SmoothStreaming aktiviert werden.

CMCD-Datenschlüssel

CMCD-Datenschlüssel werden in vier verschiedene Typen unterteilt:

  • CMCD-Anfrage: Schlüssel, deren Werte sich mit jeder Anfrage unterscheiden.
  • CMCD-Object: Schlüssel, deren Werte sich je nach angefragtem Objekt unterscheiden.
  • CMCD-Status: Schlüssel, deren Werte sich nicht bei jeder Anfrage oder jedem Objekt ändern.
  • CMCD-Session: Schlüssel, deren Werte voraussichtlich während der Lebensdauer der Sitzung unverändert bleiben.

Arten der Datenübertragung

CMCD-Daten können mit einer von zwei Methoden übertragen werden:

  • Als benutzerdefinierter HTTP-Anfrageheader, was dem Standardverhalten entspricht.
  • Als HTTP-Abfrageargument.

CMCD aktivieren

Zum Aktivieren von CMCD müssen Sie eine Instanz von CmcdConfiguration.Factory erstellen und diese an das MediaSource.Factory übergeben, das beim Erstellen des Players verwendet wird. Sie können entweder den standardmäßigen CmcdConfiguration.Factory verwenden oder Ihre eigene benutzerdefinierte Factory angeben, die jedes Mal aufgerufen wird, wenn eine adaptive Medienquelle für das jeweilige Medienelement erstellt wird.

CMCD mit Standardkonfigurations-Factory aktivieren

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

CMCD mit Werkseinstellung für benutzerdefinierte Konfigurationen aktivieren

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

Beispiele für CMCD-Daten

Die folgenden Beispiele zeigen gültige Datenkombinationen von Daten, die beim Abrufen von Medienblöcken gesendet werden:

  • Als benutzerdefinierte HTTP-Anfrageheader

       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"
    
  • Als HTTP-Abfrageargumente

       ?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