我正在使用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
答案 0 :(得分:1)
好的,我刚刚回答了一个问题,它让文字轨道以一种简单的方式工作here。这适用于自适应文件(如HLS),但我必须对其进行修改以使其与渐进文件一起使用(例如与.srt文件合并的.mp4)。
这至少是一个起点。
我想回过头来让它完全适合你,但我认为这可能是使用跟踪索引并调整覆盖以使其不使用AdaptiveFactory(来自下面)线)。
TrackSelection.Factory factory = tracks.length == 1
? new FixedTrackSelection.Factory()
: new AdaptiveTrackSelection.Factory(BANDWIDTH_METER);
我们在HLS和progressive的代码中完全使用它,但是我们的实现包含在许多额外的体系结构中,这可能使得理解核心组件变得更加困难。