미디어 플레이어 클라이언트는 콘텐츠 전송에 중요한 정보를 전송할 수 있습니다. 각 객체 요청이 있는 네트워크 (CDN) 이 데이터를 전송하면 QoS 모니터링, 적응형 트래픽 최적화, 전송 성능을 개선하여 궁극적으로 소비자 경험을 개선할 수 있습니다.
ExoPlayer의 구현은 CTA-5004
Exoplayer의 CMCD 지원
ExoPlayer의 CMCD 지원은 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)
자바
// 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