Dane klienta Common Media Client Data (CMCD)

Klienci odtwarzacza multimediów mogą przesyłać cenne informacje do sieci dostarczania treści (CDN) wraz z każdym żądaniem obiektu. Przesyłanie tych danych może poprawić monitorowanie jakości usług, adaptacyjną optymalizację ruchu i skuteczność dostarczania, co w rezultacie zwiększy komfort użytkowników.

Implementacja w ExoPlayerze jest oparta na specyfikacji zdefiniowanej w CTA-5004.

Obsługa CMCD w odtwarzaczu Exo

Obsługę CMCD w ExoPlayerze można włączyć tylko w przypadku formatów strumieniowania adaptacyjnego, takich jak DASH, HLSSmoothStreaming.

Klucze danych CMCD

Klucze danych CMCD są podzielone na 4 różne typy:

  • CMCD-Request: klucze, których wartości różnią się w zależności od żądania.
  • CMCD-Object: klucze, których wartości różnią się w zależności od żądanego obiektu.
  • CMCD-Status: klucze, których wartości nie zmieniają się przy każdej prośbie ani obiekcie.
  • CMCD-Session: klucze, których wartości powinny być niezmienne przez cały czas trwania sesji.

Sposoby przesyłania danych

Dane CMCD można przesyłać na 2 sposoby:

  • Jako niestandardowy nagłówek żądania HTTP, co jest domyślnym zachowaniem.
  • jako argument zapytania HTTP,

Włączanie CMCD

Aby włączyć CMCD, musisz utworzyć instancję CmcdConfiguration.Factory i przekazać ją do MediaSource.Factory, która jest używana podczas tworzenia odtwarzacza. Możesz użyć domyślnej fabryki CmcdConfiguration.Factory lub podać własną fabrykę niestandardową, która będzie wywoływana za każdym razem, gdy dla danego elementu multimedialnego zostanie utworzone adaptacyjne źródło multimediów.

Włączanie CMCD z domyślną konfiguracją fabryczną

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

Włączanie CMCD za pomocą niestandardowej fabryki konfiguracji

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

Przykłady danych CMCD

Te przykłady ilustrują prawidłowe kombinacje danych wysyłanych podczas pobierania fragmentów multimediów:

  • jako niestandardowe nagłówki żądań HTTP.

       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"
    
  • Jako argumenty zapytania 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