2017-11-02 3 views
0

Leanbackライブラリを使用してテレビ用Androidアプリを開発しています。私はHLSビデオストリームを持っていて、URIのsrt字幕を持っています。このexample appで使用されているExoPlayerバージョン2.5.4を使用しています。私は私のMediaSource使用して作成された:私のPlaybackTransportControlGlueLeanback 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私はすでに第2のリンクであなたの提案をしました。最初のリンクは、ビデオ品質とオーディオの変化について話しているようです。私はそれを望んでいない。ボタンをクリックすると、クローズドキャプションをオン/オフするだけです。私はすでにボタンにリスナーを持っています。私はどのコードが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とプログレッシブの両方のために我々のコードで働いていますが、私たちの実装は、それがさらに困難コアコンポーネントを理解することになるかもしれない追加的なアーキテクチャの多くに包まれています。

関連する問題