미디어 소스

ExoPlayer에서 모든 미디어는 MediaItem로 표시됩니다. 그러나 내부적으로 플레이어에 콘텐츠를 재생하려면 MediaSource 인스턴스가 필요합니다. 플레이어는 MediaSource.Factory를 사용하여 미디어 항목에서 이를 만듭니다.

기본적으로 플레이어는 다음과 같은 콘텐츠 MediaSource 구현의 인스턴스를 만들 수 있는 DefaultMediaSourceFactory를 사용합니다.

DefaultMediaSourceFactory는 상응하는 미디어 항목의 속성에 따라 더 복잡한 미디어 소스를 만들 수도 있습니다. 이 내용은 미디어 항목 페이지에 자세히 설명되어 있습니다.

플레이어의 기본 구성에서 지원되지 않는 미디어 소스 설정이 필요한 앱의 경우 맞춤설정할 수 있는 몇 가지 옵션이 있습니다.

미디어 소스 생성 맞춤설정

플레이어를 빌드할 때 MediaSource.Factory를 삽입할 수 있습니다. 예를 들어 앱에서 광고를 삽입하고 CacheDataSource.Factory를 사용하여 캐싱을 지원하려는 경우 DefaultMediaSourceFactory 인스턴스를 이러한 요구사항에 맞게 구성하고 플레이어 생성 중에 삽입할 수 있습니다.

Kotlin

  val mediaSourceFactory: MediaSource.Factory =
    DefaultMediaSourceFactory(context)
      .setDataSourceFactory(cacheDataSourceFactory)
      .setLocalAdInsertionComponents(adsLoaderProvider, playerView)
  val player = ExoPlayer.Builder(context).setMediaSourceFactory(mediaSourceFactory).build()

자바

MediaSource.Factory mediaSourceFactory =
    new DefaultMediaSourceFactory(context)
        .setDataSourceFactory(cacheDataSourceFactory)
        .setLocalAdInsertionComponents(adsLoaderProvider, /* adViewProvider= */ playerView);
ExoPlayer player =
    new ExoPlayer.Builder(context).setMediaSourceFactory(mediaSourceFactory).build();

DefaultMediaSourceFactory JavaDoc에서 사용 가능한 옵션을 자세히 설명합니다.

맞춤 MediaSource.Factory 구현을 삽입할 수도 있습니다(예: 맞춤 미디어 소스 유형 생성 지원). 재생목록에 추가된 각 미디어 항목의 미디어 소스를 만들기 위해 팩토리의 createMediaSource(MediaItem)가 호출됩니다.

미디어 소스 기반 재생목록 API

ExoPlayer 인터페이스는 미디어 항목이 아닌 미디어 소스를 허용하는 추가 재생목록 메서드를 정의합니다. 이렇게 하면 플레이어의 내부 MediaSource.Factory를 우회하고 미디어 소스 인스턴스를 플레이어에 직접 전달할 수 있습니다.

Kotlin

// Set a list of media sources as initial playlist.
exoPlayer.setMediaSources(listOfMediaSources)
// Add a single media source.
exoPlayer.addMediaSource(anotherMediaSource)

// Can be combined with the media item API.
exoPlayer.addMediaItem(/* index= */ 3, MediaItem.fromUri(videoUri))

exoPlayer.prepare()
exoPlayer.play()

자바

// Set a list of media sources as initial playlist.
exoPlayer.setMediaSources(listOfMediaSources);
// Add a single media source.
exoPlayer.addMediaSource(anotherMediaSource);

// Can be combined with the media item API.
exoPlayer.addMediaItem(/* index= */ 3, MediaItem.fromUri(videoUri));

exoPlayer.prepare();
exoPlayer.play();

고급 미디어 소스 구성

ExoPlayer는 다른 MediaSource 인스턴스를 수정하고 컴포지션하는 여러 MediaSource 구현을 제공합니다. 이는 여러 맞춤설정을 결합해야 하고 더 간단한 설정 경로 중 어느 것도 충분하지 않은 경우에 가장 유용합니다.

  • ClippingMediaSource: 지정된 타임스탬프 범위로 미디어를 클립할 수 있습니다. 이 작업이 유일한 수정사항인 경우 대신 MediaItem.ClippingConfiguration를 사용하는 것이 좋습니다.
  • FilteringMediaSource: 사용 가능한 트랙을 지정된 유형으로 필터링합니다. 예를 들어 오디오와 동영상이 모두 포함된 파일에서 동영상 트랙만 노출합니다. 이 작업이 유일한 수정사항이라면 트랙 선택 매개변수를 대신 사용하는 것이 좋습니다.
  • MergingMediaSource: 여러 미디어 소스를 병합하여 동시에 재생합니다. 거의 모든 경우에 모든 소스가 동시에 시작되고 종료되도록 adjustPeriodTimeOffsetsclipDurations를 true로 설정하여 생성자를 호출하는 것이 좋습니다. 사이드로드된 자막을 추가하기 위해 이 수정을 수행하는 경우 MediaItem.SubtitleConfiguration를 대신 사용하는 것이 좋습니다.
  • ConcatenatingMediaSource2: 여러 미디어 소스를 병합하여 연속으로 재생합니다. 사용자에게 표시되는 미디어 구조는 단일 Timeline.Window를 노출하므로 단일 항목처럼 보입니다. 단일 항목처럼 보이지 않는 여러 항목을 재생하기 위해 이 수정을 실행하는 경우 Player.addMediaItem와 같은 재생목록 API 메서드를 대신 사용하는 것이 좋습니다.
  • SilenceMediaSource: 공백을 메우는 데 유용한 지정된 시간 동안 무음을 생성합니다.
  • AdsMediaSource: 클라이언트 측 광고 삽입 기능으로 미디어 소스를 확장합니다. 자세한 내용은 광고 삽입 가이드를 참고하세요.
  • ServerSideAdInsertionMediaSource: 서버 측 광고 삽입 기능으로 미디어 소스를 확장합니다. 자세한 내용은 광고 삽입 가이드를 참고하세요.