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