Я разрабатываю приложение для Android для ТВ, используя библиотеку Leanback
. У меня есть видеопоток HLS
с субтитрами srt
из URI. Я использую 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
selector.setSelectionOverride(rendererIndex, trackGroups, override);
по-прежнему будет работать на то, что вы хотите. ВместоC.TRACK_TYPE_VIDEO
вам нужноC.TRACK_TYPE_TEXT
. Если это неясно, просто дайте мне знать, и я напишу более подробный ответ ниже. - person Kyle Venn   schedule 14.11.2017MediaPlayerGlue
, в котором я написал приведенный выше код. - person khateeb   schedule 16.11.2017