미디어 항목에 여러 트랙이 포함된 경우 트랙 선택은 재생에 선택할 트랙을 결정하는 프로세스입니다. 트랙 선택 프로세스는 TrackSelectionParameters
로 구성되며, 이를 통해 트랙 선택에 영향을 미치는 다양한 제약 조건과 재정의를 지정할 수 있습니다.
사용 가능한 트랙 쿼리
Player.Listener.onTracksChanged
를 수신 대기하여 다음과 같은 트랙 변경사항에 관한 알림을 받을 수 있습니다.
- 재생 중인 미디어 항목의 준비가 완료되면 사용 가능한 트랙이 알려집니다. 플레이어는 미디어 항목을 준비하여 포함된 트랙을 알아야 합니다.
- 재생이 한 미디어 항목에서 다른 미디어 항목으로 전환되어 사용 가능한 트랙이 변경됩니다.
- 선택한 트랙의 변경사항
Kotlin
player.addListener( object : Player.Listener { override fun onTracksChanged(tracks: Tracks) { // Update UI using current tracks. } } )
자바
player.addListener( new Player.Listener() { @Override public void onTracksChanged(Tracks tracks) { // Update UI using current tracks. } });
player.getCurrentTracks()
를 호출하여 현재 트랙을 쿼리할 수도 있습니다.
반환된 Tracks
에는 Tracks.Group
객체 목록이 포함되며, 여기서 단일 Group
내의 트랙은 동일한 콘텐츠를 서로 다른 형식으로 표시합니다.
트랙을 그룹화하는 방법의 예로, 기본 동영상 피드가 5가지 비트 전송률로 제공되고 대체 동영상 피드(예: 스포츠 경기의 다른 카메라 각도)가 2가지 비트 전송률로 제공되는 적응형 재생을 들 수 있습니다. 이 경우 동영상 트랙 그룹이 두 개가 됩니다. 하나는 트랙 5개가 포함된 기본 동영상 피드에 해당하고 다른 하나는 트랙 2개가 포함된 대체 동영상 피드에 해당합니다.
언어가 다른 오디오 트랙은 그룹화되지 않습니다. 다른 언어의 콘텐츠는 동일한 것으로 간주되지 않기 때문입니다. 반대로 비트 전송률, 샘플링 레이트, 채널 수와 같은 속성만 다른 동일한 언어의 오디오 트랙은 그룹화할 수 있습니다. 이는 텍스트 트랙에도 적용됩니다.
각 Group
를 쿼리하여 재생이 지원되는 트랙, 현재 선택된 트랙, 각 트랙에서 사용하는 Format
를 확인할 수 있습니다.
Kotlin
for (trackGroup in tracks.groups) { // Group level information. val trackType = trackGroup.type val trackInGroupIsSelected = trackGroup.isSelected val trackInGroupIsSupported = trackGroup.isSupported for (i in 0 until trackGroup.length) { // Individual track information. val isSupported = trackGroup.isTrackSupported(i) val isSelected = trackGroup.isTrackSelected(i) val trackFormat = trackGroup.getTrackFormat(i) } }
자바
for (Tracks.Group trackGroup : tracks.getGroups()) { // Group level information. @C.TrackType int trackType = trackGroup.getType(); boolean trackInGroupIsSelected = trackGroup.isSelected(); boolean trackInGroupIsSupported = trackGroup.isSupported(); for (int i = 0; i < trackGroup.length; i++) { // Individual track information. boolean isSupported = trackGroup.isTrackSupported(i); boolean isSelected = trackGroup.isTrackSelected(i); Format trackFormat = trackGroup.getTrackFormat(i); } }
Player
가 샘플을 디코딩하고 렌더링할 수 있는 경우 트랙이 지원됩니다. 동일한 유형의 여러 트랙 그룹 (예: 여러 오디오 트랙 그룹)이 지원되더라도 개별적으로 지원된다는 의미일 뿐 플레이어에서 반드시 동시에 재생할 수 있는 것은 아닙니다.- 현재
TrackSelectionParameters
를 고려하여 재생을 위해 선택된 트랙은 선택됩니다. 한 트랙 그룹 내에서 여러 트랙이 선택된 경우 플레이어는 이러한 트랙을 적응형 재생에 사용합니다 (예: 비트 전송률이 다른 여러 동영상 트랙). 한 번에 하나의 트랙만 재생됩니다.
트랙 선택 매개변수 수정
트랙 선택 프로세스는 Player.setTrackSelectionParameters
를 사용하여 구성할 수 있습니다. 재생 전이나 재생 중에 할 수 있습니다. 다음 예는 플레이어에서 현재 TrackSelectionParameters
를 가져와 수정한 후 수정된 결과로 Player
를 업데이트하는 방법을 보여줍니다.
Kotlin
player.trackSelectionParameters = player.trackSelectionParameters .buildUpon() .setMaxVideoSizeSd() .setPreferredAudioLanguage("hu") .build()
자바
player.setTrackSelectionParameters( player .getTrackSelectionParameters() .buildUpon() .setMaxVideoSizeSd() .setPreferredAudioLanguage("hu") .build());
제약 조건 기반 트랙 선택
TrackSelectionParameters
의 대부분의 옵션을 사용하면 실제로 사용 가능한 트랙과는 무관한 제약 조건을 지정할 수 있습니다. 사용 가능한 제약조건은 다음과 같습니다.
- 최대 및 최소 동영상 너비, 높이, 프레임 속도, 비트 전송률
- 최대 오디오 채널 수 및 비트 전송률입니다.
- 동영상 및 오디오의 기본 MIME 유형입니다.
- 선호하는 오디오 언어 및 역할 플래그
- 기본 텍스트 언어 및 역할 플래그
ExoPlayer는 이러한 제약 조건에 적절한 기본값을 사용합니다. 예를 들어 동영상 해상도를 디스플레이 크기로 제한하고 사용자의 시스템 언어 설정과 일치하는 오디오 언어를 선호합니다.
사용 가능한 트랙 중에서 특정 트랙을 선택하는 대신 제약 조건 기반 트랙 선택을 사용하면 다음과 같은 여러 이점이 있습니다.
- 미디어 항목에서 제공하는 트랙을 알기 전에 제약조건을 지정할 수 있습니다. 즉, 플레이어가 미디어 항목을 준비하기 전에 제약 조건을 지정할 수 있지만 특정 트랙을 선택하려면 애플리케이션 코드가 사용 가능한 트랙이 알려질 때까지 기다려야 합니다.
- 제약 조건은 재생목록의 모든 미디어 항목에 적용되며, 이러한 항목에 사용 가능한 트랙이 서로 다른 경우에도 마찬가지입니다. 예를 들어 선호하는 오디오 언어 제약 조건은 해당 언어의 트랙
Format
가 미디어 항목마다 다르더라도 모든 미디어 항목에 자동으로 적용됩니다. 아래에 설명된 대로 특정 트랙을 선택하는 경우에는 그렇지 않습니다.
특정 트랙 선택
TrackSelectionParameters
를 사용하여 특정 트랙을 선택할 수 있습니다. 먼저 Player.getCurrentTracks
를 사용하여 현재 사용 가능한 플레이어의 트랙을 쿼리해야 합니다. 두 번째로, 선택할 트랙을 식별한 후 TrackSelectionOverride
를 사용하여 TrackSelectionParameters
에 설정할 수 있습니다.
예를 들어 특정 audioTrackGroup
에서 첫 번째 트랙을 선택하려면 다음을 실행합니다.
Kotlin
player.trackSelectionParameters = player.trackSelectionParameters .buildUpon() .setOverrideForType( TrackSelectionOverride(audioTrackGroup.mediaTrackGroup, /* trackIndex= */ 0) ) .build()
자바
player.setTrackSelectionParameters( player .getTrackSelectionParameters() .buildUpon() .setOverrideForType( new TrackSelectionOverride( audioTrackGroup.getMediaTrackGroup(), /* trackIndex= */ 0)) .build());
TrackSelectionOverride
는 재정의에 지정된 것과 정확히 일치하는 TrackGroup
가 포함된 미디어 항목에만 적용됩니다. 따라서 후속 미디어 항목에 다른 트랙이 포함된 경우 재정의가 적용되지 않을 수 있습니다.
트랙 유형 또는 그룹 사용 중지
동영상, 오디오, 텍스트와 같은 트랙 유형은 TrackSelectionParameters.Builder.setTrackTypeDisabled
를 사용하여 완전히 사용 중지할 수 있습니다. 사용 중지된 트랙 유형은 모든 미디어 항목에서 사용 중지됩니다.
Kotlin
player.trackSelectionParameters = player.trackSelectionParameters .buildUpon() .setTrackTypeDisabled(C.TRACK_TYPE_VIDEO, /* disabled= */ true) .build()
자바
player.setTrackSelectionParameters( player .getTrackSelectionParameters() .buildUpon() .setTrackTypeDisabled(C.TRACK_TYPE_VIDEO, /* disabled= */ true) .build());
또는 해당 그룹에 빈 재정의를 지정하여 특정 TrackGroup
에서 트랙이 선택되지 않도록 할 수 있습니다.
Kotlin
player.trackSelectionParameters = player.trackSelectionParameters .buildUpon() .addOverride( TrackSelectionOverride(disabledTrackGroup.mediaTrackGroup, /* trackIndices= */ listOf()) ) .build()
자바
player.setTrackSelectionParameters( player .getTrackSelectionParameters() .buildUpon() .addOverride( new TrackSelectionOverride( disabledTrackGroup.getMediaTrackGroup(), /* trackIndices= */ ImmutableList.of())) .build());
트랙 선택기 맞춤설정
트랙 선택은 TrackSelector
의 책임이며, TrackSelector
의 인스턴스는 ExoPlayer
가 빌드될 때마다 제공되고 나중에 ExoPlayer.getTrackSelector()
로 가져올 수 있습니다.
Kotlin
val trackSelector = DefaultTrackSelector(context) val player = ExoPlayer.Builder(context).setTrackSelector(trackSelector).build()
자바
DefaultTrackSelector trackSelector = new DefaultTrackSelector(context); ExoPlayer player = new ExoPlayer.Builder(context).setTrackSelector(trackSelector).build();
DefaultTrackSelector
는 대부분의 사용 사례에 적합한 유연한 TrackSelector
입니다. Player
에 설정된 TrackSelectionParameters
를 사용하지만 DefaultTrackSelector.ParametersBuilder
에서 지정할 수 있는 몇 가지 고급 맞춤설정 옵션도 제공합니다.
Kotlin
trackSelector.setParameters( trackSelector.buildUponParameters().setAllowVideoMixedMimeTypeAdaptiveness(true)) )
자바
trackSelector.setParameters( trackSelector.buildUponParameters().setAllowVideoMixedMimeTypeAdaptiveness(true));
터널링
렌더러와 선택한 트랙의 조합에서 지원하는 경우 터널링된 재생을 사용 설정할 수 있습니다. 이렇게 하려면 DefaultTrackSelector.ParametersBuilder.setTunnelingEnabled(true)
을 사용합니다.
오디오 오프로드
렌더러와 선택한 트랙의 조합에서 오프로드된 오디오 재생을 지원하는 경우 이를 사용 설정할 수 있습니다. 이렇게 하려면 TrackSelectionParameters
에서 AudioOffloadModePreferences
를 지정합니다.
Kotlin
val audioOffloadPreferences = AudioOffloadPreferences.Builder() .setAudioOffloadMode(AudioOffloadPreferences.AUDIO_OFFLOAD_MODE_ENABLED) // Add additional options as needed .setIsGaplessSupportRequired(true) .build() player.trackSelectionParameters = player.trackSelectionParameters .buildUpon() .setAudioOffloadPreferences(audioOffloadPreferences) .build()
Java
AudioOffloadPreferences audioOffloadPreferences = new AudioOffloadPreferences.Builder() .setAudioOffloadMode(AudioOffloadPreferences.AUDIO_OFFLOAD_MODE_ENABLED) // Add additional options as needed .setIsGaplessSupportRequired(true) .build(); player.setTrackSelectionParameters( player.getTrackSelectionParameters() .buildUpon() .setAudioOffloadPreferences(audioOffloadPreferences) .build()); );