CMCD(Common Media Client Data)

미디어 플레이어 클라이언트는 각 객체 요청과 함께 콘텐츠 전송 네트워크 (CDN)에 유용한 정보를 전송할 수 있습니다. 이 데이터를 전송하면 QoS 모니터링, 적응형 트래픽 최적화, 전송 성능을 개선하여 궁극적으로 소비자 환경을 개선할 수 있습니다.

ExoPlayer의 구현은 CTA-5004에 정의된 사양을 기반으로 합니다.

Exoplayer의 CMCD 지원

ExoPlayer의 CMCD 지원은 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)

자바

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

자바

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