ExoPlayer(SimpleExoPlayer)的addTextOutput已废弃?求替代方案
ExoPlayer 2.18.5 替代废弃addTextOutput的方案
在ExoPlayer 2.18.5版本里,addTextOutput(TextOutput)确实已经被废弃,下面是几个可行的替代方案,顺便帮你优化下字幕轨道选择的代码:
1. 用带Handler的重载API:addTextOutput(TextOutput, Handler)
官方保留了带Handler参数的版本,用来指定字幕回调的线程(一般用主线程处理UI),示例代码如下:
// 自定义字幕回调处理逻辑 val textOutput = TextOutput { cueList -> // 遍历拿到每一条字幕数据 cueList.forEach { cue -> // cue.text就是字幕文本,还能获取位置、样式等信息 // 这里可以把字幕显示到你自定义的View上 } } // 主线程Handler,保证UI操作安全 val mainHandler = Handler(Looper.getMainLooper()) // 添加字幕输出监听 simpleExoPlayer.addTextOutput(textOutput, mainHandler) // 记得在页面销毁时移除监听,避免内存泄漏 override fun onDestroy() { super.onDestroy() simpleExoPlayer.removeTextOutput(textOutput) }
2. 直接用PlayerView自动渲染字幕
如果不需要自定义字幕UI,ExoPlayer的PlayerView自带字幕渲染功能,只要做好两步:
- 确保字幕轨道已正确选中(后面会优化你的选择代码)
- 在布局或代码里启用字幕显示:
布局示例:
<com.google.android.exoplayer2.ui.PlayerView android:id="@+id/playerView" android:layout_width="match_parent" android:layout_height="match_parent" app:show_subtitle_button="true" app:subtitle_text_size="16sp" />
代码里设置样式:
playerView.subtitleView?.run { setTextSize(16f) setStyle(CaptionStyleCompat.DEFAULT) }
3. 优化你的字幕轨道选择代码
你原来的代码里SelectionOverride传入C.INDEX_UNSET会取消字幕选择,这是问题所在,而且没有优先匹配目标语言,修正后的代码:
@Override public void onCaption() { TrackGroupArray trackGroups = mPlayer.getCurrentTrackGroups(); int groupIndex = -1; int textTrackIndex = -1; // 优先查找韩语字幕 for (int i = 0; i < trackGroups.length; i++) { TrackGroup group = trackGroups.get(i); if (group.length > 0 && mPlayer.getRendererType(i) == C.TRACK_TYPE_TEXT) { for (int j = 0; j < group.length; j++) { Format format = group.getFormat(j); // 匹配韩语字幕 if ("ko".equals(format.language)) { groupIndex = i; textTrackIndex = j; break; } } // 找到韩语就跳出循环 if (textTrackIndex != -1) { break; } // 如果没找到韩语,选第一个可用字幕 if (groupIndex == -1 && group.length > 0) { groupIndex = i; textTrackIndex = 0; } } } if (groupIndex != -1 && textTrackIndex != -1) { DefaultTrackSelector.SelectionOverride override = new DefaultTrackSelector.SelectionOverride( groupIndex, textTrackIndex // 这里传入正确的字幕索引,不是C.INDEX_UNSET ); mTrackSelector.setParameters(((DefaultTrackSelector) mTrackSelector).buildUponParameters() .setRendererDisabled(C.TRACK_TYPE_TEXT, false) .setPreferredTextLanguage("ko") .setSelectionOverride(C.TRACK_TYPE_TEXT, trackGroups, override) .build()); } }
内容的提问来源于stack exchange,提问作者asdf9797
相关产品推荐
相关产品推荐

