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

ExoPlayer 2.14.0无法加载.srt格式字幕问题求助

结论

不需要单独使用SubtitleView,PlayerView自带的SubtitleView完全可以实现srt字幕的显示功能,你当前无法显示是代码配置遗漏导致的,以下是具体问题和修复方案:


问题1:轨道选择器未开启字幕轨道自动选择

ExoPlayer默认的DefaultTrackSelector不会自动选中字幕轨道,需要手动配置轨道选择参数,允许匹配对应语言的字幕轨:

// 初始化ExoPlayer前先配置轨道选择器
DefaultTrackSelector trackSelector = new DefaultTrackSelector(this);
DefaultTrackSelector.Parameters params = trackSelector.buildUponParameters()
        .setSelectUndeterminedTextLanguage(true) // 未指定语言的字幕也会被选中
        .setPreferredTextLanguage("en") // 匹配你字幕配置的"en"语言标记
        .build();
trackSelector.setParameters(params);

// 初始化播放器时传入配置好的轨道选择器
simpleExoPlayer = new ExoPlayer.Builder(this)
        .setTrackSelector(trackSelector)
        .build();

问题2:addTextOutput代码冗余且存在崩溃风险

你不需要手动调用setCues、setVisibility等方法操作SubtitleView,只要完成playerView.setPlayer(simpleExoPlayer)绑定,PlayerView会自动把字幕传递给自带的SubtitleView渲染,手动操作反而可能导致异常。

如果需要保留字幕日志,简化后的代码如下,同时规避空列表的崩溃问题:

simpleExoPlayer.addTextOutput(cues -> {
    if (!cues.isEmpty() && cues.get(0).text != null) {
        Log.d("subtitles", cues.get(0).text.toString());
    }
});

问题3:字幕构建逻辑可优化

你当前的MergingMediaSource写法是可行的,不过更简洁的方式是直接把字幕配置添加到MediaItem中,不需要手动合并媒体源:

public void buildMediaSourceV3(Uri uri){
    String subtitlesUri = sharedPreferencesSubtitles.getString(videoName.getText().toString(), "");
    DataSource.Factory factory = new DefaultDataSourceFactory(VideoPlayer.this, getPackageName(), new DefaultBandwidthMeter());
    
    MediaItem.Builder mediaItemBuilder = new MediaItem.Builder().setUri(uri);
    if(!subtitlesUri.equals("")) {
        MediaItem.Subtitle subtitle = new MediaItem.Subtitle(
                Uri.parse(subtitlesUri),
                MimeTypes.APPLICATION_SUBRIP,
                "en",
                C.SELECTION_FLAG_DEFAULT // 增加默认选中标记,提高轨道匹配优先级
        );
        mediaItemBuilder.setSubtitles(Collections.singletonList(subtitle));
    }
    
    MediaSource videoSource = new ProgressiveMediaSource.Factory(factory).createMediaSource(mediaItemBuilder.build());
    simpleExoPlayer.addMediaSource(videoSource);
}

额外排查点

  • 确保你已经调用了playerView.setPlayer(simpleExoPlayer)完成播放器和视图的绑定
  • 检查srt文件的编码格式为UTF-8,非UTF-8编码的字幕文件会解析失败
  • 如果日志能正常打印字幕内容但界面不显示,检查是否给SubtitleView设置了和背景一致的文字颜色,或者文字尺寸为0的异常配置

内容的提问来源于stack exchange,提问作者Rag

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.18 02:54:01