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

Android TV应用ExoPlayer播放UDP流无音频,getCurrentTracks语言为null

Android TV ExoPlayer UDP流媒体音频无法播放问题

我开发了一款Android TV应用,使用ExoPlayer播放UDP流媒体地址,视频播放正常,但无法播放音频。为排查问题,我编写了如下代码查看ExoPlayer的音轨信息:

for (int i = 0; i < player.getCurrentTracks().getGroups().size(); i++) {
    String format = player.getCurrentTracks().getGroups().get(i).getTrackFormat(0).sampleMimeType;
    String lang = player.getCurrentTracks().getGroups().get(i).getTrackFormat(0).language;
    player.getCurrentTracks().getGroups().get(i).getTrackFormat(0).id;
}

执行后发现音轨组数量为2,但两个音轨对象的language字段始终为null。请问如何强制音频正常播放?


解决方法

1. 先确认音频格式兼容性

通过你现有代码里的sampleMimeType字段,查看音频具体编码类型(比如audio/mp4a-latm、audio/ac3等)。如果是小众编码,需要给ExoPlayer添加对应扩展库(比如Dolby、DTS扩展包),或者检查当前ExoPlayer版本是否包含该格式的解码器支持。

2. 强制指定音轨(忽略语言字段)

ExoPlayer可能因无法识别语言字段而跳过音频播放,可手动遍历选择音频轨道:

TrackSelectionParameters.Builder paramsBuilder = player.getTrackSelectionParameters().buildUpon();
// 遍历音轨组,定位音频轨道
for (int i = 0; i < player.getCurrentTracks().getGroups().size(); i++) {
    TrackGroup group = player.getCurrentTracks().getGroups().get(i);
    Format format = group.getTrackFormat(0);
    if (MimeTypes.isAudio(format.sampleMimeType)) {
        // 强制选中该音频轨道
        paramsBuilder.setOverrideType(format.sampleMimeType, TrackSelectionOverride.forSingleTrack(group, 0));
        break;
    }
}
player.setTrackSelectionParameters(paramsBuilder.build());

3. 检查音频渲染器配置

初始化ExoPlayer时,确保音频渲染器未被禁用:

DefaultRenderersFactory renderersFactory = new DefaultRenderersFactory(context);
renderersFactory.setEnableAudioTrackPlaybackParams(true);
ExoPlayer player = new ExoPlayer.Builder(context, renderersFactory).build();

4. 优化UDP流的提取配置

如果是TS封装的UDP流,可能存在解析问题,可显式配置提取器:

MediaItem mediaItem = MediaItem.fromUri(udpUri);
DefaultMediaSourceFactory mediaSourceFactory = new DefaultMediaSourceFactory(context);
// 忽略加密数据,提升TS流解析兼容性
mediaSourceFactory.setExtractorsFactory(new DefaultExtractorsFactory().setTsExtractorFlags(TsExtractor.FLAG_IGNORE_SCRAMBLED_DATA));
player.setMediaSource(mediaSourceFactory.createMediaSource(mediaItem));

5. 强制启用软件解码

部分Android TV设备硬件解码支持有限,可尝试强制软件解码:

DefaultRenderersFactory renderersFactory = new DefaultRenderersFactory(context);
renderersFactory.setForceEnableSoftwareAudioDecoding(true);
ExoPlayer player = new ExoPlayer.Builder(context, renderersFactory).build();

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.18 01:10:32