Клиенты медиаплеера могут передавать ценную информацию в сети доставки контента (CDN) с каждым запросом объекта. Передача этих данных может улучшить мониторинг QoS, адаптивную оптимизацию трафика и производительность доставки, что в конечном итоге улучшает качество обслуживания потребителей.
Реализация в ExoPlayer основана на спецификации, определенной в CTA-5004 .
Поддержка CMCD в Exoplayer
Поддержка CMCD в ExoPlayer может быть включена только для адаптивных форматов потоковой передачи, таких как DASH , HLS и SmoothStreaming .
Ключи данных CMCD
Ключи данных CMCD подразделяются на четыре различных типа:
- CMCD-Request : ключи, значения которых меняются в зависимости от каждого запроса.
- CMCD-Object : ключи, значения которых различаются в зависимости от запрашиваемого объекта.
- CMCD-Status : ключи, значения которых не меняются в зависимости от каждого запроса или объекта.
- CMCD-Session : ключи, значения которых, как ожидается, будут неизменными на протяжении всего сеанса.
Режимы передачи данных
Данные CMCD могут передаваться одним из двух методов:
- В качестве пользовательского заголовка HTTP-запроса, что является поведением по умолчанию .
- В качестве аргумента HTTP-запроса.
Включить CMCD
Чтобы включить CMCD, вам необходимо создать экземпляр CmcdConfiguration.Factory
и передать его в MediaSource.Factory
, который используется при сборке проигрывателя . Вы можете использовать CmcdConfiguration.Factory
по умолчанию или предоставить свою собственную фабрику, которая вызывается каждый раз, когда создается адаптивный источник мультимедиа для данного элемента мультимедиа.
Включить CMCD с фабрикой конфигурации по умолчанию
Котлин
// Create media source factory and set default cmcdConfigurationFactory. val mediaSourceFactory = DefaultMediaSourceFactory(context) .setCmcdConfigurationFactory(CmcdConfiguration.Factory.DEFAULT)
Ява
// Create media source factory and set default cmcdConfigurationFactory. MediaSource.Factory mediaSourceFactory = new DefaultMediaSourceFactory(context) .setCmcdConfigurationFactory(CmcdConfiguration.Factory.DEFAULT);
Включить CMCD с помощью фабрики пользовательской конфигурации
Котлин
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)
Ява
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);
Примеры данных CMCD
Эти примеры иллюстрируют допустимые комбинации данных, отправляемых при извлечении фрагментов мультимедиа:
В качестве пользовательских заголовков 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"
В качестве аргументов 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