Dane klienta Common Media Client Data (CMCD)

Klienci odtwarzaczy multimedialnych mogą przesyłać cenne informacje do sieci dostarczania treści (CDN) przy każdym żądaniu obiektu. Transmitowanie tych danych może poprawić monitorowanie QoS, adaptacyjną optymalizację ruchu oraz wydajność wyświetlania, co w ostatecznym rozrachunku poprawi wrażenia klientów.

Implementacja w odtwarzaczu ExoPlayer opiera się na specyfikacji zdefiniowanej w dokumencie CTA-5004.

Obsługa CMCD w odtwarzaczu Exo

Obsługa CMCD w narzędziu ExoPlayer można włączyć tylko w przypadku adaptacyjnych formatów strumieniowego przesyłania danych, takich jak DASH, HLS i SmoothStreaming.

Klucze danych CMCD

Klucze danych CMCD dzielą się na 4 typy:

  • Żądanie CMCD: 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 różnią się w zależności od żądania ani obiektu.
  • CMCD-Session: klucze, których wartości powinny być niezmienne w trakcie trwania sesji.

Środki transportu danych

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

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

Włącz CMCD

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

Włącz CMCD z fabryką konfiguracji domyślnej

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łącz CMCD z fabryką konfiguracji niestandardowej

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 pokazują 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