【问题标题】:How to toggle closed captions in Leanback ExoPlayer?如何在 Leanback ExoPlayer 中切换隐藏式字幕?
【发布时间】:2018-04-15 00:01:28
【问题描述】:

我正在使用 Leanback 库为电视开发 Android 应用。我有一个 HLS 视频流,带有来自 URI 的 srt 字幕。我正在使用ExoPlayer 版本2.5.4,正如example app 中使用的那样。我创建了我的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

【问题讨论】:

  • 我有一个关于视频轨道选择的答案,但同样的逻辑也适用于字幕轨道选择。如果您需要更多信息,我可以在这里写出更深入的答案。让我知道 :) stackoverflow.com/questions/45835562/… 还有这个答案可能更合适。如果不是您要找的,请告诉我:stackoverflow.com/questions/46521570/…
  • @KyleVenn 我已经在第二个链接中做了你的建议。第一个链接似乎是在谈论改变视频质量和音频。我不想要那个。我只想在单击按钮时打开和关闭隐藏式字幕。我已经在按钮上有了一个监听器。我想知道什么代码会切换 CC。
  • 第一个链接是关于视频质量 (TRACK_TYPE_VIDEO),但相同的代码应该适用于隐藏式字幕(因为它们也由轨道组支持)。 selector.setSelectionOverride(rendererIndex, trackGroups, override); 仍然可以满足您的需求。而不是C.TRACK_TYPE_VIDEO,您需要C.TRACK_TYPE_TEXT。如果不清楚,请告诉我,我会在下面写出更详尽的答案。
  • @KyleVenn 我尝试了第一个链接和 ExoPlayer 示例应用程序中写的内容,但没有成功。我只是无法解决这个问题。我已经用我的代码更新了这个问题。我正在像这个项目一样使用 ExoPlayer:github.com/googlesamples/leanback-showcase/blob/master/app/src/…。在这个项目中,有一个名为MediaPlayerGlue 的类,我在其中编写了上述代码。
  • 好的,我会试着让他们的例子更清楚。我实际上建议使用the ExoPlayer demo app,这正是您想要的(允许选择字幕轨道)。运行该应用程序(在手机上)并逐步执行选择字幕的代码应该会使其更加清晰。在电视上也一样。

标签: android android-tv exoplayer leanback


【解决方案1】:

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

这至少是一个起点。

我想绕回去让它完全为你工作,但我认为这可能是使用轨道索引并调整覆盖以使其不使用 AdaptiveFactory 的问题(从下面行)。

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

我们已经在 HLS 和渐进式代码中完全运行它,但我们的实现包含在许多额外的架构中,这可能使理解核心组件变得更加困难。

【讨论】:

    猜你喜欢
    • 2017-07-14
    • 2020-03-26
    • 1970-01-01
    • 1970-01-01
    • 2013-02-01
    • 1970-01-01
    • 2011-05-22
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多