ExoPlayer에서 모든 미디어는 MediaItem
로 표시됩니다. 그러나 내부적으로 플레이어에 콘텐츠를 재생하려면 MediaSource
인스턴스가 필요합니다. 플레이어는 MediaSource.Factory
를 사용하여 미디어 항목에서 이를 만듭니다.
기본적으로 플레이어는 다음과 같은 콘텐츠 MediaSource
구현의 인스턴스를 만들 수 있는 DefaultMediaSourceFactory
를 사용합니다.
- DASH의
DashMediaSource
- SmoothStreaming의 경우
SsMediaSource
입니다. - HLS의 경우
HlsMediaSource
- 일반 미디어 파일의 경우
ProgressiveMediaSource
RtspMediaSource
: RTSP
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
: 여러 미디어 소스를 병합하여 동시에 재생합니다. 거의 모든 경우에 모든 소스가 동시에 시작되고 종료되도록adjustPeriodTimeOffsets
및clipDurations
를 true로 설정하여 생성자를 호출하는 것이 좋습니다. 사이드로드된 자막을 추가하기 위해 이 수정을 수행하는 경우MediaItem.SubtitleConfiguration
를 대신 사용하는 것이 좋습니다.ConcatenatingMediaSource2
: 여러 미디어 소스를 병합하여 연속으로 재생합니다. 사용자에게 표시되는 미디어 구조는 단일Timeline.Window
를 노출하므로 단일 항목처럼 보입니다. 단일 항목처럼 보이지 않는 여러 항목을 재생하기 위해 이 수정을 실행하는 경우Player.addMediaItem
와 같은 재생목록 API 메서드를 대신 사용하는 것이 좋습니다.SilenceMediaSource
: 공백을 메우는 데 유용한 지정된 시간 동안 무음을 생성합니다.AdsMediaSource
: 클라이언트 측 광고 삽입 기능으로 미디어 소스를 확장합니다. 자세한 내용은 광고 삽입 가이드를 참고하세요.ServerSideAdInsertionMediaSource
: 서버 측 광고 삽입 기능으로 미디어 소스를 확장합니다. 자세한 내용은 광고 삽입 가이드를 참고하세요.