如何在Leanback ExoPlayer中切换隐藏式字幕?

时间:2017-11-02 12:46:41

标签: android android-tv exoplayer leanback

我正在使用Leanback库为电视开发Android应用。我有一个HLS视频流,其中包含来自URI的srt字幕。我正在使用此example app中使用的ExoPlayer版本2.5.4。我使用

创建了MediaSource
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;
}

在我的PlaybackTransportControlGlue中,我有一个PlaybackControlsRow.ClosedCaptioningAction。单击此按钮时,我应该在操作调度程序中写入什么来切换隐藏式字幕?

我试过了:

@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);
}

我收到了这个错误:

E/gralloc: unregister FBM buffer

1 个答案:

答案 0 :(得分:1)

好的,我刚刚回答了一个问题,它让文字轨道以一种简单的方式工作here。这适用于自适应文件(如HLS),但我必须对其进行修改以使其与渐进文件一起使用(例如与.srt文件合并的.mp4)。

这至少是一个起点。

我想回过头来让它完全适合你,但我认为这可能是使用跟踪索引并调整覆盖以使其不使用AdaptiveFactory(来自下面)线)。

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

我们在HLS和progressive的代码中完全使用它,但是我们的实现包含在许多额外的体系结构中,这可能使得理解核心组件变得更加困难。