Flutter just_audio安卓端无法播放多种音频格式问题求助
问题描述
使用Flutter的just_audio插件播放AC3、AIF、MPEG、AU、AIFF、AIFC、CAF、SD2格式音频时,iOS端可正常播放,但安卓端抛出错误:
Caused by: com.google.android.exoplayer2.source.UnrecognizedInputFormatException: None of the available extractors (PsExtractor, FlvExtractor, FlacExtractor, WavExtractor, FragmentedMp4Extractor, Mp4Extractor, AmrExtractor, OggExtractor, TsExtractor, MatroskaExtractor, AdtsExtractor, Ac3Extractor, Ac4Extractor, Mp3Extractor, AviExtractor, JpegExtractor) could read the stream.
原因分析
just_audio在安卓端基于ExoPlayer实现,ExoPlayer默认支持的音频提取器有限,部分小众格式(如AIF/AIFF、CAF、SD2、AU等)不在默认支持列表中;而iOS系统原生音频框架对这些格式有更好的兼容性,因此无播放问题。
解决方案
1. 引入ExoPlayer扩展库
在安卓项目的Module级别build.gradle中添加对应扩展依赖,扩展ExoPlayer的格式支持:
dependencies { // 支持AIF/AIFF等格式 implementation "com.google.android.exoplayer:extension-flac:${exoplayer_version}" // 支持CAF格式 implementation "com.google.android.exoplayer:extension-caf:${exoplayer_version}" // 按需添加其他格式扩展 implementation "com.google.android.exoplayer:extension-mp3:${exoplayer_version}" }
注意:${exoplayer_version}需替换为just_audio依赖的ExoPlayer版本,可查看just_audio的官方文档或安卓项目依赖树确认具体版本。
2. 强制指定音频格式
对于ExoPlayer已支持但自动检测失败的格式(如AC3),初始化音频源时手动指定格式:
final player = AudioPlayer(); await player.setAudioSource( ProgressiveAudioSource( Uri.parse("your_audio_file_url"), contentType: AudioContentType.ac3, // 强制指定AC3格式 ), );
3. 服务端格式转换兜底
若上述方法仍无法解决兼容性问题,建议在服务端将小众格式批量转换为安卓广泛支持的格式(如MP3、AAC),从根源上避免播放异常。
内容的提问来源于stack exchange,提问作者Gurpreet Singh

