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