트랙 선택

미디어 항목에 여러 트랙이 포함된 경우 트랙 선택은 어느 것이 재생에 선택되는지 결정합니다. 트랙 선택 프로세스는 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에는 Track.Group 객체 목록이 포함되며, 여기서 단일 Group는 동일한 콘텐츠를 다른 형식으로 표시합니다.

트랙을 그룹화하는 방법의 예로 적응형 재생을 생각해 보세요. 기본 동영상 피드는 다섯 가지 비트 전송률로 제공되며, 대체 동영상 피드는 (예: 스포츠 경기에서 다른 카메라 각도)는 두 개의 비트 전송률로 제공됩니다. 이 경우 두 개의 동영상 트랙 그룹이 있는데, 하나는 기본 트랙과 연결되어 있고 트랙 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의 역할 이 중 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)

오디오 오프로드

오프로드된 오디오 재생을 사용 설정할 수 있습니다. 일부 트랙에서 지원됩니다. 이렇게 하려면 TrackSelectionParametersAudioOffloadModePreferences

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