Dane klienta Common Media Client Data (CMCD)

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

Implementacja w ExoPlayer opiera się na specyfikacji określonej w CTA-5004.

Obsługa CMCD w Exoplayer

Obsługa CMCD w rozszerzeniu ExothPlayer można włączyć tylko w przypadku adaptacyjnych formatów strumieniowania, takich jak DASH, HLS i SmoothStreaming.

Klucze danych CMCD

Klucze danych CMCD są podzielone na 4 typy:

  • CMCD-Request: klucze, których wartości zmieniają 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 i obiektu.
  • CMCD-Session: klucze, których wartości powinny być niezmienne w trakcie trwania sesji.

Tryby 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łącz 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ślnego pola 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łą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łącz CMCD z fabryką niestandardową

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