是否有使用字幕的 ExoPlayer + Leanback 库示例?
Is there an ExoPlayer + Leanback library example for using captions?
我找到了一些适用于 Leanback
和 ExoPlayer
的示例,我已经完成了所有这些工作,但我无法让 subtitles/captions 工作。我能找到的最新 Google 示例 (https://github.com/android/tv-samples) 在 Java 示例上有一个字幕按钮,但它们从未出现过。 Kotlin 示例有一个注释 // TODO(owahltinez): handle captions
。
我已尝试对其中一个示例进行这些更改,但没有帮助:
private void prepareMediaForPlaying(Uri mediaSourceUri) {
String userAgent = Util.getUserAgent(getActivity(), "VideoPlayerGlue");
DefaultDataSourceFactory defaultDataSourceFactory = new DefaultDataSourceFactory(getActivity(), userAgent);
MediaSource mediaSource =
new ExtractorMediaSource(
mediaSourceUri,
defaultDataSourceFactory,
new DefaultExtractorsFactory(),
null,
null);
String subtitle = "https://subtitledomain/sintel-en.vtt";
Uri uriSubtitle = Uri.parse(subtitle);
MediaSource subtitleMediaSource = new SingleSampleMediaSource.Factory(defaultDataSourceFactory)
.createMediaSource(uriSubtitle, Format.createTextSampleFormat(null, MimeTypes.TEXT_VTT, C.SELECTION_FLAG_FORCED, "n/a"), C.TIME_UNSET);
mediaSource = new MergingMediaSource(mediaSource, subtitleMediaSource);
mPlayer.prepare(mediaSource);
}
还有这个变化:
mTrackSelector = new DefaultTrackSelector(videoTrackSelectionFactory);
DefaultTrackSelector.Parameters parameters = mTrackSelector.getParameters();
mTrackSelector.setParameters(parameters.withSelectUndeterminedTextLanguage(true));
我试过将字幕语言更改为 EN
但没有用。
我觉得我可能只是错过了一些小东西,但我只是不知道它可能是什么。
谢谢。
编辑:我创建了一个分支并删除了所有 Leanback
代码,只保留 ExoPlayer
内容不变并在我的 Fragment
中使用了 com.google.android.exoplayer2.ui.PlayerView
而不是 VideoFragment
和字幕在没有进行任何其他更改的情况下工作。所以就像我只需要以某种方式在 Leanback
端启用它们。
这是另一种方法——renderIndex = 0 视频,=1 音频,=2 subtitles/text。
TrackGroupArray trackGroups = mappedTrackInfo.getTrackGroups(rendererIndex);
TrackSelectionArray currentTrackGroups = player.getCurrentTrackSelections();
TrackSelection currentTrackSelection = currentTrackGroups.get(rendererIndex);
for (int groupIndex = 0; groupIndex < trackGroups.length; groupIndex++) {
TrackGroup group = trackGroups.get(groupIndex);
for (int trackIndex = 0; trackIndex < group.length; trackIndex++) {
Format trackFormat = group.getFormat(trackIndex);
if(currentTrackSelection!=null &&
currentTrackSelection.getSelectedFormat()==trackFormat){
//THIS ONE IS SELECTED
}
}
}
要使字幕正常工作,您需要覆盖 lb_playback_fragment.xml 并添加一个 SubtitleView。
app/src/main/res/layout/lb_playback_fragment.xml
<?xml version="1.0" encoding="utf-8"?>
<!--
Copied from android source so that we can add the subtitle view
-->
<FrameLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/playback_fragment_root"
android:layout_width="match_parent"
android:transitionGroup="false"
android:layout_height="match_parent">
<androidx.leanback.widget.NonOverlappingFrameLayout
android:id="@+id/playback_fragment_background"
android:transitionGroup="false"
android:layout_width="match_parent"
android:layout_height="match_parent" />
<androidx.leanback.widget.NonOverlappingFrameLayout
android:id="@+id/playback_controls_dock"
android:transitionGroup="true"
android:layout_height="match_parent"
android:layout_width="match_parent"/>
<com.google.android.exoplayer2.ui.AspectRatioFrameLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_gravity="center">
<com.google.android.exoplayer2.ui.SubtitleView
android:id="@+id/leanback_subtitles"
android:layout_width="match_parent"
android:layout_height="match_parent" />
</com.google.android.exoplayer2.ui.AspectRatioFrameLayout>
</FrameLayout>
完成此操作后,您可以将 DefaultTrackSelector 设置为 select 您想要的文本轨道。
您可以在 https://github.com/bennettpeter/android-MythTV-Leanfront. The change to add subtitles is in this commit.
中查看基于示例 Leanback 播放器的完整代码
我找到了一些适用于 Leanback
和 ExoPlayer
的示例,我已经完成了所有这些工作,但我无法让 subtitles/captions 工作。我能找到的最新 Google 示例 (https://github.com/android/tv-samples) 在 Java 示例上有一个字幕按钮,但它们从未出现过。 Kotlin 示例有一个注释 // TODO(owahltinez): handle captions
。
我已尝试对其中一个示例进行这些更改,但没有帮助:
private void prepareMediaForPlaying(Uri mediaSourceUri) {
String userAgent = Util.getUserAgent(getActivity(), "VideoPlayerGlue");
DefaultDataSourceFactory defaultDataSourceFactory = new DefaultDataSourceFactory(getActivity(), userAgent);
MediaSource mediaSource =
new ExtractorMediaSource(
mediaSourceUri,
defaultDataSourceFactory,
new DefaultExtractorsFactory(),
null,
null);
String subtitle = "https://subtitledomain/sintel-en.vtt";
Uri uriSubtitle = Uri.parse(subtitle);
MediaSource subtitleMediaSource = new SingleSampleMediaSource.Factory(defaultDataSourceFactory)
.createMediaSource(uriSubtitle, Format.createTextSampleFormat(null, MimeTypes.TEXT_VTT, C.SELECTION_FLAG_FORCED, "n/a"), C.TIME_UNSET);
mediaSource = new MergingMediaSource(mediaSource, subtitleMediaSource);
mPlayer.prepare(mediaSource);
}
还有这个变化:
mTrackSelector = new DefaultTrackSelector(videoTrackSelectionFactory);
DefaultTrackSelector.Parameters parameters = mTrackSelector.getParameters();
mTrackSelector.setParameters(parameters.withSelectUndeterminedTextLanguage(true));
我试过将字幕语言更改为 EN
但没有用。
我觉得我可能只是错过了一些小东西,但我只是不知道它可能是什么。
谢谢。
编辑:我创建了一个分支并删除了所有 Leanback
代码,只保留 ExoPlayer
内容不变并在我的 Fragment
中使用了 com.google.android.exoplayer2.ui.PlayerView
而不是 VideoFragment
和字幕在没有进行任何其他更改的情况下工作。所以就像我只需要以某种方式在 Leanback
端启用它们。
这是另一种方法——renderIndex = 0 视频,=1 音频,=2 subtitles/text。
TrackGroupArray trackGroups = mappedTrackInfo.getTrackGroups(rendererIndex);
TrackSelectionArray currentTrackGroups = player.getCurrentTrackSelections();
TrackSelection currentTrackSelection = currentTrackGroups.get(rendererIndex);
for (int groupIndex = 0; groupIndex < trackGroups.length; groupIndex++) {
TrackGroup group = trackGroups.get(groupIndex);
for (int trackIndex = 0; trackIndex < group.length; trackIndex++) {
Format trackFormat = group.getFormat(trackIndex);
if(currentTrackSelection!=null &&
currentTrackSelection.getSelectedFormat()==trackFormat){
//THIS ONE IS SELECTED
}
}
}
要使字幕正常工作,您需要覆盖 lb_playback_fragment.xml 并添加一个 SubtitleView。
app/src/main/res/layout/lb_playback_fragment.xml
<?xml version="1.0" encoding="utf-8"?>
<!--
Copied from android source so that we can add the subtitle view
-->
<FrameLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/playback_fragment_root"
android:layout_width="match_parent"
android:transitionGroup="false"
android:layout_height="match_parent">
<androidx.leanback.widget.NonOverlappingFrameLayout
android:id="@+id/playback_fragment_background"
android:transitionGroup="false"
android:layout_width="match_parent"
android:layout_height="match_parent" />
<androidx.leanback.widget.NonOverlappingFrameLayout
android:id="@+id/playback_controls_dock"
android:transitionGroup="true"
android:layout_height="match_parent"
android:layout_width="match_parent"/>
<com.google.android.exoplayer2.ui.AspectRatioFrameLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_gravity="center">
<com.google.android.exoplayer2.ui.SubtitleView
android:id="@+id/leanback_subtitles"
android:layout_width="match_parent"
android:layout_height="match_parent" />
</com.google.android.exoplayer2.ui.AspectRatioFrameLayout>
</FrameLayout>
完成此操作后,您可以将 DefaultTrackSelector 设置为 select 您想要的文本轨道。
您可以在 https://github.com/bennettpeter/android-MythTV-Leanfront. The change to add subtitles is in this commit.
中查看基于示例 Leanback 播放器的完整代码