You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.26 09:27:43