Общие данные клиента мультимедиа (CMCD)

Клиенты медиапроигрывателей могут передавать ценную информацию в сети доставки контента (CDN) с каждым запросом объекта. Передача этих данных может улучшить мониторинг качества обслуживания, адаптивную оптимизацию трафика и эффективность доставки, что в конечном итоге повысит удобство для потребителей.

Реализация в 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 с помощью фабрики конфигураций по умолчанию

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);

Как включить CMCD с помощью пользовательской фабрики конфигураций

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);

Примеры данных 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