미디어 소스

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

Java

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

Java

// 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와 같은 playlist API 메서드를 대신 사용하는 것이 좋습니다.
  • SilenceMediaSource: 지정된 시간 동안 간격을 채우는 데 유용한 무음을 생성합니다.
  • AdsMediaSource: 클라이언트 측 광고 삽입 기능이 있는 미디어 소스를 확장합니다. 자세한 내용은 광고 삽입 가이드를 참고하세요.
  • ServerSideAdInsertionMediaSource: 서버 측 광고 삽입 기능으로 미디어 소스를 확장합니다. 자세한 내용은 광고 삽입 가이드를 참고하세요.