ข้อมูลไคลเอ็นต์สื่อทั่วไป (CMCD)

ไคลเอ็นต์ของมีเดียเพลเยอร์สามารถส่งข้อมูลที่มีประโยชน์ไปยังเครือข่ายนำส่งเนื้อหา (CDN) พร้อมกับคำขอออบเจ็กต์แต่ละรายการ การส่งข้อมูลดังกล่าวจะช่วยปรับปรุงการตรวจสอบ QoS การเพิ่มประสิทธิภาพการรับส่งข้อมูลแบบปรับตัว และประสิทธิภาพการนำส่ง ซึ่งจะช่วย ปรับปรุงประสบการณ์ของผู้บริโภคในท้ายที่สุด

การใช้งานใน ExoPlayer อิงตามข้อกำหนดที่ระบุไว้ใน CTA-5004

การรองรับ CMCD ใน Exoplayer

การรองรับ CMCD ใน ExoPlayer จะเปิดใช้ได้เฉพาะสำหรับรูปแบบการสตรีมที่ปรับเปลี่ยนได้ เช่น DASH, HLS และ SmoothStreaming

คีย์ข้อมูล CMCD

คีย์ข้อมูล CMCD แบ่งออกเป็น 4 ประเภทที่แตกต่างกัน ดังนี้

  • 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