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