ExoPlayer는 여러 컨테이너 형식으로 DASH를 지원합니다. 미디어 스트림은 역다중화되어야 합니다. 즉, 동영상, 오디오 및 텍스트는 DASH 매니페스트의 고유한 AdaptationSet
요소에 정의되어야 합니다 (CEA-608은 아래 표에 설명된 예외임). 포함된 오디오 및 동영상 샘플 형식도 지원되어야 합니다 (자세한 내용은 샘플 형식 섹션 참고).
기능 | 지원됨 | 댓글 |
---|---|---|
컨테이너 | ||
FMP4 | 예 | 디믹스된 스트림만 |
WebM | 예 | 디믹스된 스트림만 |
마트로스카 | 예 | 디믹스된 스트림만 |
MPEG-TS | 아니요 | 지원 예정 없음 |
자막 | ||
TTML : ML | 예 | 원시 데이터 또는 ISO/IEC 14496-30에 따라 FMP4에 삽입됨 |
WebVTT | 예 | 원시 데이터 또는 ISO/IEC 14496-30에 따라 FMP4에 삽입됨 |
CEA-608 | 예 | SCTE 접근성 설명어를 사용하여 신호를 보낼 때 FMP4에 삽입됨 |
CEA-708 | 예 | SCTE 접근성 설명어를 사용하여 신호를 보낼 때 FMP4에 삽입됨 |
Metadata | ||
EMSG 메타데이터 | 예 | FMP4에 삽입됨 |
콘텐츠 보호 | ||
Widevine | 예 | 'cenc' 스키마: API 19 이상, 'cbcs' 스키마: API 25 이상 |
PlayReady SL2000 | 예 | Android TV, 'cenc' 스키마만 해당 |
키 삭제 | 예 | API 21 이상, 'cenc' 스키마만 해당 |
실시간 재생 | ||
정기 라이브 재생 | 예 | |
지연 시간이 매우 짧은 CMAF 실시간 재생 | 예 | |
Common Media Client Data (CMCD) | 예 | 통합 가이드 |
MediaItem 사용
DASH 스트림을 재생하려면 DASH 모듈을 사용해야 합니다.
Kotlin
implementation("androidx.media3:media3-exoplayer-dash:1.3.1")
Groovy
implementation "androidx.media3:media3-exoplayer-dash:1.3.1"
그런 다음 DASH MPD URI의 MediaItem
를 만들어 플레이어에 전달할 수 있습니다.
Kotlin
// Create a player instance. val player = ExoPlayer.Builder(context).build() // Set the media item to be played. player.setMediaItem(MediaItem.fromUri(dashUri)) // Prepare the player. player.prepare()
Java
// Create a player instance. ExoPlayer player = new ExoPlayer.Builder(context).build(); // Set the media item to be played. player.setMediaItem(MediaItem.fromUri(dashUri)); // Prepare the player. player.prepare();
URI가 .mpd
로 끝나지 않으면 MimeTypes.APPLICATION_MPD
를 MediaItem.Builder
의 setMimeType
에 전달하여 콘텐츠 유형을 명시적으로 나타낼 수 있습니다.
ExoPlayer는 사용 가능한 대역폭과 기기 기능을 모두 고려하여 매니페스트에 정의된 표현 간에 자동으로 조정합니다.
DashMediaSource 사용
더 많은 맞춤설정 옵션을 보려면 DashMediaSource
를 만들어 MediaItem
대신 플레이어에 직접 전달하면 됩니다.
Kotlin
val dataSourceFactory: DataSource.Factory = DefaultHttpDataSource.Factory() // Create a dash media source pointing to a dash manifest uri. val mediaSource: MediaSource = DashMediaSource.Factory(dataSourceFactory).createMediaSource(MediaItem.fromUri(dashUri)) // Create a player instance which gets an adaptive track selector by default. val player = ExoPlayer.Builder(context).build() // Set the media source to be played. player.setMediaSource(mediaSource) // Prepare the player. player.prepare()
Java
DataSource.Factory dataSourceFactory = new DefaultHttpDataSource.Factory(); // Create a dash media source pointing to a dash manifest uri. MediaSource mediaSource = new DashMediaSource.Factory(dataSourceFactory) .createMediaSource(MediaItem.fromUri(dashUri)); // Create a player instance which gets an adaptive track selector by default. ExoPlayer player = new ExoPlayer.Builder(context).build(); // Set the media source to be played. player.setMediaSource(mediaSource); // Prepare the player. player.prepare();
매니페스트에 액세스
Player.getCurrentManifest
를 호출하여 현재 매니페스트를 가져올 수 있습니다.
DASH의 경우 반환된 객체를 DashManifest
로 변환해야 합니다. Player.Listener
의 onTimelineChanged
콜백도 매니페스트가 로드될 때마다 호출됩니다. 이 작업은 주문형 콘텐츠에 한 번, 라이브 콘텐츠에 여러 번 발생할 수 있습니다. 다음 코드 스니펫은 매니페스트가 로드될 때마다 앱이 어떤 작업을 실행할 수 있는지 보여줍니다.
Kotlin
player.addListener( object : Player.Listener { override fun onTimelineChanged(timeline: Timeline, @TimelineChangeReason reason: Int) { val manifest = player.currentManifest if (manifest is DashManifest) { // Do something with the manifest. } } } )
Java
player.addListener( new Player.Listener() { @Override public void onTimelineChanged( Timeline timeline, @Player.TimelineChangeReason int reason) { Object manifest = player.getCurrentManifest(); if (manifest != null) { DashManifest dashManifest = (DashManifest) manifest; // Do something with the manifest. } } });
재생 맞춤설정
ExoPlayer는 앱의 요구사항에 따라 재생 환경을 맞춤설정할 수 있는 여러 방법을 제공합니다. 예시를 보려면 맞춤설정 페이지를 참조하세요.