DASH

ExoPlayer는 여러 컨테이너 형식으로 DASH를 지원합니다. 미디어 스트림은 역다중화(demuxed)의 약어로, 동영상, 오디오, 텍스트를 서로 구분되는 DASH 매니페스트의 AdaptationSet 요소 (CEA-608은 아래 표에 설명) 포함된 오디오 및 동영상 샘플 형식은 도 지원됩니다 (자세한 내용은 샘플 형식 섹션을 참조하세요.)

기능 지원됨 비고
컨테이너
FMP4는 역다중화된 스트림만
WebM 역다중화된 스트림만
Matroska 역다중화된 스트림만
MPEG-TS 아니요 지원 계획 없음
자막
TTML 원시 또는 ISO/IEC 14496-30에 따라 FMP4에 삽입됨
WebVTT 원시 또는 ISO/IEC 14496-30에 따라 FMP4에 삽입됨
CEA-608 SCTE 접근성 설명자를 사용하여 신호를 보낼 때 FMP4에 삽입됨
CEA-708 SCTE 접근성 설명어를 사용하여 신호를 보낼 때 FMP4에 삽입됨
메타데이터
EMSG 메타데이터 FMP4에 삽입됨
콘텐츠 보호
Widevine 'cenc' 스키마: API 19 이상; 'cbcs' 스키마: API 25 이상
PlayReady SL2000 Android TV, 'cenc' 스키마만
ClearKey API 21 이상, 'cenc' 스키마만 해당
실시간 재생
일반 라이브 재생
매우 짧은 지연 시간 CMAF 실시간 재생
CMCD (Common Media Client Data) 통합 가이드

MediaItem 사용

DASH 스트림을 재생하려면 DASH 모듈을 사용해야 합니다.

Kotlin

implementation("androidx.media3:media3-exoplayer-dash:1.4.1")

Groovy

implementation "androidx.media3:media3-exoplayer-dash:1.4.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()

자바

// 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.BuildersetMimeType로 지정하여 있습니다.

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

자바

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.ListeneronTimelineChanged 콜백은 매니페스트가 로드될 때마다 호출됩니다. 이는 주문형 콘텐츠의 경우 한 번 적용되며 여러 번 반복할 수 있습니다 다음 코드 스니펫은 매니페스트가 로드될 때마다 앱이 어떤 작업을 실행할 수 있는지 보여줍니다.

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.
      }
    }
  }
)

자바

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는 사용자의 기기에 맞게 재생 환경을 맞춤설정하는 다양한 방법을 파악할 수 있습니다. 예시는 맞춤설정 페이지를 참고하세요.