ExoPlayer 2.8.2获取可用音轨及切换音轨的技术求助
ExoPlayer 2.8.2 音频轨道获取与切换方案
我来帮你解决这个问题,针对你使用的ExoPlayer 2.8.2版本,结合你遇到的无语言标签轨道的情况,给你具体的实现思路和代码:
一、快速筛选并获取音频轨道信息
你现在通过player.getCurrentTrackGroups()拿到的是所有类型的轨道(视频、音频、字幕等),我们可以通过判断MIME类型来快速过滤出音频轨道,同时收集后续切换需要的关键信息(比如轨道所在的组索引、轨道自身索引、语言标签、轨道ID等)。
代码示例如下:
// 假设player是你的SimpleExoPlayer实例 TrackGroups trackGroups = player.getCurrentTrackGroups(); // 自定义列表存储音频轨道的关键信息 List<AudioTrackItem> audioTrackList = new ArrayList<>(); for (int groupIndex = 0; groupIndex < trackGroups.length; groupIndex++) { TrackGroup trackGroup = trackGroups.get(groupIndex); for (int trackIndex = 0; trackIndex < trackGroup.length; trackIndex++) { Format format = trackGroup.getFormat(trackIndex); // 筛选音频轨道:判断MIME类型是否以audio/开头 if (format.mimeType != null && format.mimeType.startsWith("audio/")) { // 收集需要的信息,方便后续切换 audioTrackList.add(new AudioTrackItem( groupIndex, trackIndex, format.language, format.id )); } } } // 自定义实体类,用来封装音频轨道的关键信息 class AudioTrackItem { public final int groupIndex; public final int trackIndex; public final String language; public final String trackId; public AudioTrackItem(int groupIndex, int trackIndex, String language, String trackId) { this.groupIndex = groupIndex; this.trackIndex = trackIndex; this.language = language; this.trackId = trackId; } }
这样你就能得到仅包含音频轨道的列表,每个项里的groupIndex和trackIndex是后续切换轨道的核心参数。
二、切换音频轨道(支持无语言标签的场景)
你提到的selectTrack方法确实在ExoPlayer 2.8.2中已经被移除,而setPreferredAudioLanguage只对带有语言标签的轨道生效。对于无语言标签、仅靠ID区分的轨道,我们可以用TrackSelectionOverride来指定具体的轨道:
代码示例如下:
// 假设你已经通过上面的代码拿到了audioTrackList,现在要切换到第N个轨道 int selectedTrackPosition = 0; // 这里替换成你实际选中的轨道索引 AudioTrackItem targetTrack = audioTrackList.get(selectedTrackPosition); TrackGroup targetTrackGroup = player.getCurrentTrackGroups().get(targetTrack.groupIndex); // 创建TrackSelectionOverride,指定要切换到的轨道 TrackSelectionOverride trackOverride = new TrackSelectionOverride( trackSelector.getAudioTrackSelectionFactory(), targetTrackGroup, targetTrack.trackIndex ); // 构建参数并设置给TrackSelector DefaultTrackSelector.Parameters newParams = trackSelector.getParameters() .buildUpon() .setOverrideForType(trackOverride) .build(); trackSelector.setParameters(newParams);
补充说明:
TrackSelectionOverride会强制ExoPlayer使用你指定的音频轨道,不管轨道有没有语言标签;- 如果你需要恢复到自动选择轨道的状态,可以调用:
DefaultTrackSelector.Parameters resetParams = trackSelector.getParameters() .buildUpon() .clearOverridesOfType(C.TRACK_TYPE_AUDIO) .build(); trackSelector.setParameters(resetParams);
内容的提问来源于stack exchange,提问作者oto
相关产品推荐
相关产品推荐

