Mediaplayer-Clients können mit jeder Objektabfrage wertvolle Informationen an Content Delivery Networks (CDNs) übertragen. Die Übertragung dieser Daten kann die QoS-Überwachung, die adaptive Verkehrsoptimierung und die Bereitstellungsleistung verbessern und letztendlich die Nutzerfreundlichkeit steigern.
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 ändern.
- CMCD-Objekt: Schlüssel, deren Werte je nach angefordertem Objekt variieren.
- CMCD-Status: Schlüssel, deren Werte sich nicht mit jeder Anfrage oder jedem Objekt ändern.
- CMCD-Session: Schlüssel, deren Werte während der gesamten Sitzung unverändert bleiben sollten.
Methoden zur Datenübertragung
CMCD-Daten können mit einer von zwei Methoden übertragen werden:
- Als benutzerdefinierter HTTP-Anfrageheader, was das Standardverhalten ist.
- Als HTTP-Abfrageargument.
CMCD aktivieren
Wenn Sie CMCD aktivieren möchten, müssen Sie eine Instanz von CmcdConfiguration.Factory erstellen und an MediaSource.Factory übergeben, die beim Erstellen des Players verwendet wird. Sie können entweder die Standard-CmcdConfiguration.Factory verwenden oder eine eigene benutzerdefinierte Factory angeben, die jedes Mal aufgerufen wird, wenn für das angegebene Media-Element eine adaptive Media-Quelle erstellt wird.
CMCD mit der 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 benutzerdefinierter Konfigurationsfactory 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 veranschaulichen gültige Datenkombinationen, die beim Abrufen von Media-Chunks 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