Common Media Client Data (CMCD)

Kunden von Mediaplayern können wertvolle Informationen an die Inhaltsübermittlung übertragen. Netzwerke (CDNs) mit jeder Objektanfrage. Durch das Übertragen dieser Daten kann die Dienstqualität verbessert werden. das Monitoring, die adaptive Traffic-Optimierung und die Bereitstellungsleistung. die Nutzererfahrung verbessern.

Die Implementierung in ExoPlayer basiert auf der im folgenden Abschnitt definierten Spezifikation. CTA-5004:

CMCD-Unterstützung im Exoplayer

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

CMCD-Datenschlüssel

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

  • CMCD-Anfrage: Schlüssel, deren Werte bei jeder Anfrage variieren.
  • CMCD-Object: Schlüssel, deren Werte je nach angefordertem Objekt variieren.
  • CMCD-Status: Schlüssel, deren Werte nicht bei jeder Anfrage oder jedem Objekt variieren.
  • CMCD-Session: Schlüssel, deren Werte voraussichtlich gegenüber der während der Sitzung.

Arten der Datenübertragung

CMCD-Daten können mit einer der beiden Methoden übertragen werden:

  • Als benutzerdefinierten HTTP-Anfrageheader (Standardverhalten).
  • Als HTTP-Abfrageargument.

CMCD aktivieren

Zum Aktivieren von CMCD müssen Sie eine Instanz von CmcdConfiguration.Factory erstellen und an den MediaSource.Factory übergeben, der beim Erstellen der Player Sie können entweder die Standardeinstellung CmcdConfiguration.Factory verwenden oder Ihre eigene benutzerdefinierte Factory, die jedes Mal aufgerufen wird, wenn eine adaptive Medienquelle das für das jeweilige Medienelement erstellt wurde.

CMCD mit Standardkonfiguration auf Werkseinstellungen 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 Konfigurations-Factory 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);

CMCD-Datenbeispiele

Diese Beispiele veranschaulichen gültige Datenkombinationen von Daten, die beim Abrufen gesendet werden. Medienblöcke:

  • 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