Data Klien Media Umum (CMCD)

Klien pemutar media dapat mengirimkan informasi berharga ke Jaringan Penayangan Konten (CDN) dengan setiap permintaan objek. Mengirimkan data tersebut dapat meningkatkan pemantauan QoS, pengoptimalan traffic adaptif, dan performa penayangan, sehingga pada akhirnya meningkatkan pengalaman konsumen.

Implementasi di ExoPlayer didasarkan pada spesifikasi yang ditentukan dalam CTA-5004.

Dukungan CMCD di Exoplayer

Dukungan CMCD di ExoPlayer hanya dapat diaktifkan untuk format streaming adaptif, seperti DASH, HLS, dan SmoothStreaming.

Kunci data CMCD

Kunci data CMCD diklasifikasikan menjadi empat jenis yang berbeda:

  • CMCD-Request: kunci yang nilainya bervariasi untuk setiap permintaan.
  • CMCD-Object: kunci yang nilainya bervariasi dengan objek yang diminta.
  • CMCD-Status: kunci yang nilainya tidak bervariasi untuk setiap permintaan atau objek.
  • CMCD-Session: kunci yang nilainya diharapkan invarian selama masa aktif sesi.

Mode transmisi data

Data CMCD dapat ditransmisikan menggunakan salah satu dari dua metode berikut:

  • Sebagai header permintaan HTTP kustom, yang merupakan perilaku default.
  • Sebagai argumen kueri HTTP.

Aktifkan CMCD

Untuk mengaktifkan CMCD, Anda harus membuat instance CmcdConfiguration.Factory dan meneruskannya ke MediaSource.Factory yang digunakan saat mem-build pemutar. Anda dapat menggunakan CmcdConfiguration.Factory default atau menyediakan factory kustom sendiri yang akan dipanggil setiap kali sumber media adaptif dibuat untuk item media tertentu.

Aktifkan CMCD dengan konfigurasi default factory

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

Mengaktifkan CMCD dengan factory konfigurasi kustom

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

Contoh data CMCD

Contoh ini menggambarkan kombinasi data valid dari data yang dikirim saat mengambil potongan media:

  • Sebagai header permintaan HTTP kustom

       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"
    
  • Sebagai argumen kueri 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