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
相关产品推荐
相关产品推荐

