【发布时间】: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