Dữ liệu ứng dụng đa phương tiện chung (CMCD)

Các ứng dụng trình phát nội dung đa phương tiện có thể truyền thông tin có giá trị đến Mạng phân phối nội dung (CDN) với từng yêu cầu đối tượng. Việc truyền dữ liệu đó có thể cải thiện hoạt động giám sát chất lượng dịch vụ (QoS), tối ưu hoá lưu lượng truy cập thích ứng và hiệu suất phân phối, từ đó nâng cao trải nghiệm của người tiêu dùng.

Cách triển khai trong ExoPlayer dựa trên thông số kỹ thuật được xác định trong CTA-5004.

Hỗ trợ CMCD trong Exoplayer

Bạn chỉ có thể bật tính năng hỗ trợ CMCD trong ExoPlayer cho các định dạng phát trực tuyến thích ứng, chẳng hạn như DASH, HLSSmoothStreaming.

Khoá dữ liệu CMCD

Khoá dữ liệu CMCD được phân loại thành 4 loại riêng biệt:

  • CMCD-Request: khoá có giá trị thay đổi theo từng yêu cầu.
  • CMCD-Object (Đối tượng CMCD): khoá có giá trị thay đổi theo đối tượng được yêu cầu.
  • Trạng thái CMCD: khoá có giá trị không thay đổi theo mỗi yêu cầu hoặc đối tượng.
  • CMCD-Session: các khoá có giá trị dự kiến là bất biến trong suốt thời gian hoạt động.

Các phương thức truyền dữ liệu

Bạn có thể truyền dữ liệu CMCD bằng một trong hai phương pháp sau:

  • Dưới dạng tiêu đề của yêu cầu HTTP tuỳ chỉnh, đây là hành vi mặc định.
  • Dưới dạng đối số truy vấn HTTP.

Bật CMCD

Để bật CMCD, bạn cần tạo một thực thể của CmcdConfiguration.Factory và truyền thực thể này đến MediaSource.Factory dùng khi tạo trình phát. Bạn có thể sử dụng CmcdConfiguration.Factory mặc định hoặc cung cấp nhà máy tuỳ chỉnh của riêng mình. Nhà máy này sẽ được gọi mỗi khi một nguồn nội dung nghe nhìn thích ứng được tạo cho một mục nội dung nghe nhìn nhất định.

Bật CMCD với cấu hình mặc định ban đầu

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

Bật CMCD với cấu hình nhà máy tuỳ chỉnh

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

Ví dụ về dữ liệu CMCD

Những ví dụ sau minh hoạ các cách kết hợp dữ liệu hợp lệ của dữ liệu được gửi khi tìm nạp các đoạn nội dung nghe nhìn:

  • Dưới dạng tiêu đề của yêu cầu HTTP tuỳ chỉnh

       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"
    
  • Dưới dạng đối số truy vấn 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