2017-11-02 17 views
0

Leanback 라이브러리를 사용하여 TV 용 Android 앱을 개발 중입니다. srt 자막을 URI에서 가진 HLS 비디오 스트림이 있습니다. 이 example app에 사용 된 ExoPlayer 버전 2.5.4을 사용하고 있습니다. 내 MediaSource 사용하여 만든 : 내 PlaybackTransportControlGlue에서Leanback ExoPlayer에서 자막을 전환하는 방법은 무엇입니까?

private MediaSource onCreateMediaSource(Uri uri, Uri subtitleUri) { 
    String userAgent = Util.getUserAgent(mContext, "ExoPlayerAdapter"); 
    MediaSource videoSource = new HlsMediaSource(uri, 
      new DefaultDataSourceFactory(mContext, userAgent), 
      null, 
      null); 
    Format subtitleFormat = Format.createTextSampleFormat(
      "1", MimeTypes.APPLICATION_SUBRIP, 0, "en"); 
    MediaSource subtitleSource = new SingleSampleMediaSource(
      subtitleUri, 
      new DefaultDataSourceFactory(mContext, userAgent), 
      subtitleFormat, C.TIME_UNSET); 

    MergingMediaSource mergedSource = 
      new MergingMediaSource(videoSource, subtitleSource); 
    return mergedSource; 
} 

을, 나는 PlaybackControlsRow.ClosedCaptioningAction 있습니다. 이 버튼을 클릭하면 액션 디스패처에서 자막을 토글하려면 어떻게해야합니까?

E/gralloc: unregister FBM buffer 
+0

비디오 트랙 선택에 대한 답변이 있지만 동일한 논리가 자막 트랙 선택에 적용됩니다. 더 많은 정보가 필요하다면 여기에 더 깊이있는 대답을 쓸 수 있습니다. 그냥 알려줘 :) https://stackoverflow.com/questions/45835562/quality-selector-for-exoplayer-2/45844705#45844705 더 적절한 답변도 있습니다. 네가 뭘 찾고 있는지 알려주지. https://stackoverflow.com/questions/46521570/how-to-add-multiple-subtitles-in-exo-player-2/46547904#46547904 –

+0

@KyleVenn 이미 두 번째 링크에서 제안을했습니다. 첫 번째 링크는 비디오 품질과 오디오를 바꾸는 것에 관한 것 같습니다. 나는 그것을 원하지 않는다. 단추를 클릭 할 때 자막을 표시하거나 숨길 수 있습니다. 이미 버튼에 청취자가 있습니다. 나는 어떤 코드가 CC를 토글 할 것인지 알고 싶다. – khateeb

+0

첫 번째 링크는 동영상 품질 (TRACK_TYPE_VIDEO)에 관한 것이지만 자막에는 동일한 코드가 사용되어야합니다 (트랙 그룹에서도 지원되기 때문에). 'selector.setSelectionOverride (rendererIndex, trackGroups, override);'는 여전히 당신이 원하는대로 작동 할 것입니다. 'C.TRACK_TYPE_VIDEO' 대신'C.TRACK_TYPE_TEXT'가 필요합니다. 명확하지 않은 경우 알려 주시면보다 철저한 답변을 작성하겠습니다. –

답변

1

좋아 난 그냥 간단한 방법 here에서 작업 텍스트 트랙을 가지고 질문에 대답 :이 오류가 발생했습니다

@Override 
public void onActionClicked(Action action) { 
    if (action == mClosedCaptioningAction) { 
     DefaultTrackSelector trackSelector = mAdapter.getTrackSelector(); 
     int rendererIndex = 0; 
     if (mClosedCaptioningAction.getIndex() == PlaybackControlsRow.ClosedCaptioningAction.INDEX_ON) { 
      MappingTrackSelector.MappedTrackInfo mappedTrackInfo = trackSelector.getCurrentMappedTrackInfo(); 
      TrackGroupArray textGroups = mappedTrackInfo.getTrackGroups(rendererIndex); 
      int groupIndex = 0; 

      trackSelector.setRendererDisabled(rendererIndex, false); 
      MappingTrackSelector.SelectionOverride override = 
        new MappingTrackSelector.SelectionOverride(mTrackFactory, groupIndex, 0); 
      trackSelector.setSelectionOverride(rendererIndex, textGroups, override); 
     } else { 
      trackSelector.setRendererDisabled(rendererIndex, true); 
      trackSelector.clearSelectionOverrides(); 
     } 
    } 
    super.onActionClicked(action); 
} 

:

나는이 시도. 이것은 적응 형 파일 (예 : HLS)에서 작동하지만 프로그레시브 파일 (.srt 파일과 병합 한 .mp4와 같은)에서 작동하도록 수정해야합니다.

적어도 출발점입니다.

전적으로 돌아가서 제대로 작동하도록하고 싶습니다. 그러나 트랙 인덱스를 사용하고 재정의를 조정하여 AdaptiveFactory를 사용하지 않아도 될 것이라고 생각합니다 (아래 줄).

TrackSelection.Factory factory = tracks.length == 1 
      ? new FixedTrackSelection.Factory() 
      : new AdaptiveTrackSelection.Factory(BANDWIDTH_METER); 

우리는 완전히 HLS와 진보 모두를위한 우리의 코드에서 작업,하지만 우리의 구현이 훨씬 더 힘들어 핵심 구성 요소를 이해할 수 있도록하는 추가 구조의 많은에 싸여있다.