Ortak Medya İstemcisi Verileri (CMCD)

Medya oynatıcı istemcileri, her nesne isteğiyle birlikte İçerik Dağıtım Ağları'na (CDN'ler) değerli bilgiler iletebilir. Bu verilerin iletilmesi, hizmet kalitesi izlemeyi, uyarlanabilir trafik optimizasyonunu ve yayın performansını iyileştirerek tüketici deneyimini artırabilir.

ExoPlayer'daki uygulama, CTA-5004'te tanımlanan spesifikasyona dayanır.

ExoPlayer'da CMCD desteği

ExoPlayer'da CMCD desteği yalnızca DASH, HLS ve SmoothStreaming gibi uyarlanabilir akış biçimlerinde etkinleştirilebilir.

CMCD veri anahtarları

CMCD veri anahtarları dört farklı türe ayrılır:

  • CMCD-Request: Değerleri her istekle değişen anahtarlar.
  • CMCD-Object: Değerleri, istenen nesneye göre değişen anahtarlar.
  • CMCD-Status: Değerleri her istek veya nesneyle değişmeyen anahtarlar.
  • CMCD-Session: Değerlerinin oturum süresince değişmemesi beklenen anahtarlar.

Veri iletme modları

CMCD verileri iki yöntemden biri kullanılarak iletilebilir:

  • Varsayılan davranış olan özel bir HTTP istek üstbilgisi olarak.
  • HTTP sorgu bağımsız değişkeni olarak.

CMCD'yi etkinleştirme

CMCD'yi etkinleştirmek için CmcdConfiguration.Factory örneği oluşturmanız ve bunu MediaSource.Factory öğesine iletmeniz gerekir. Bu öğe, oynatıcı oluşturulurken kullanılır. Varsayılan CmcdConfiguration.Factory öğesini kullanabilir veya belirli bir medya öğesi için uyarlanabilir medya kaynağı her oluşturulduğunda çağrılan kendi özel fabrika öğenizi sağlayabilirsiniz.

Varsayılan yapılandırma fabrikasıyla CMCD'yi etkinleştirme

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

Özel yapılandırma fabrikasıyla CMCD'yi etkinleştirme

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 verisi örnekleri

Bu örnekler, medya parçaları getirilirken gönderilen verilerin geçerli kombinasyonlarını gösterir:

  • Özel HTTP isteği başlıkları olarak

       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 sorgu bağımsız değişkenleri olarak

       ?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