ExoPlayer不支持MPEG-1音频编解码器?需额外实例配置吗?
ExoPlayer播放Mpeg Audio Layer 1/2(mpga)无声音问题解决
问题描述
服务商提供的大部分视频播放正常,但部分采用Mpeg Audio Layer 1/2(mpga)编码的视频完全没有声音。使用ExoPlayer.Builder构建实例,采用Progressive MediaSource,核心代码如下:
TrackSelector trackSelector = new DefaultTrackSelector(context); ExoPlayer.Builder builder = new ExoPlayer.Builder(context); builder.setTrackSelector(trackSelector); DefaultRenderersFactory factory = new DefaultRenderersFactory(context); builder.setRenderersFactory(factory); int bufferSegmentSize = 3; int bufferSegmentCount = 10; int minBufferMs = bufferSegmentSize * bufferSegmentCount * 1000; LoadControl loadControl = new DefaultLoadControl.Builder() .setBufferDurationsMs(minBufferMs, minBufferMs, 1500, 1500) .setTargetBufferBytes(-1) .setPrioritizeTimeOverSizeThresholds(true) .createDefaultLoadControl(); builder.setLoadControl(loadControl); player = builder.build(); player.setMediaSource(getMediaSource(context)); player.prepare(); player.play();询问构建ExoPlayer实例时是否需要额外操作。
解决方案
1. 启用扩展渲染器模式
ExoPlayer默认的DefaultRenderersFactory可能未加载MPGA对应的扩展编解码器,需显式启用扩展渲染器:
DefaultRenderersFactory factory = new DefaultRenderersFactory(context) .setExtensionRendererMode(DefaultRenderersFactory.EXTENSION_RENDERER_MODE_ON); builder.setRenderersFactory(factory);
该配置会让ExoPlayer加载所有可用的扩展编解码器,包括对Mpeg Audio Layer 1/2的支持。
2. 强制音频轨道选择
部分场景下DefaultTrackSelector可能未自动选中MPGA音频轨道,可强制开启音频轨道选择:
DefaultTrackSelector.Parameters params = new DefaultTrackSelector.ParametersBuilder(context) .setForceAudioTrackSelection(true) .build(); trackSelector.setParameters(params);
3. 集成MP3扩展库(若设备原生不支持)
部分低端设备原生不支持MPGA编码,需添加ExoPlayer的MP3扩展库依赖(替换${exoplayer_version}为你使用的版本):
implementation "com.google.android.exoplayer:exoplayer-mp3:${exoplayer_version}"
4. 临时排查缓冲配置
当前缓冲配置的最小缓冲时间过大,虽非直接原因,但可临时改用默认缓冲配置排除干扰:
LoadControl loadControl = new DefaultLoadControl();
验证步骤
- 优先修改
DefaultRenderersFactory启用扩展渲染器,测试视频是否恢复声音。 - 若无效,添加强制音频轨道选择配置。
- 仍无效果则检查设备编解码器支持,必要时集成MP3扩展库。
内容的提问来源于stack exchange,提问作者asdf9797
相关产品推荐
相关产品推荐

