Flutter AssetsAudioPlayer播放本地音频遇UnrecognizedInputFormatException异常
解决AssetsAudioPlayer播放特定MP3后无法播放其他音频的问题
我之前碰到过类似的场景,这个问题核心是特定音频的非标准格式触发ExoPlayer异常,导致播放器实例陷入错误状态无法自动恢复,下面给你几个实用的解决思路:
一、先排查文件路径的转义问题
注意到你提供的文件路径里有&,这是HTML转义后的&字符,有可能AssetsAudioPlayer解析路径时出现偏差,导致读取文件内容异常。先尝试解码路径再传入:
import 'dart:convert'; // 解码HTML转义字符 String decodedFilePath = HtmlEscape(HtmlEscapeMode.unknown).convert(widget.songInfo.filePath); // 或者用Uri解码更通用的特殊字符 // String decodedFilePath = Uri.decodeFull(widget.songInfo.filePath); try { AudioPlayerClient.getAudioPlayerClient().open( Audio.file(decodedFilePath), ); } catch (e) { print(e); }
二、捕获异常后强制重置播放器状态
触发UnrecognizedInputFormatException后,ExoPlayer的实例不会自动恢复到可用状态,需要手动停止并释放播放器,甚至重新初始化单例:
try { await AudioPlayerClient.getAudioPlayerClient().open( Audio.file(widget.songInfo.filePath), ); } catch (e) { print("播放错误: $e"); // 先停止当前播放 await AudioPlayerClient.getAudioPlayerClient().stop(); // 释放播放器资源 await AudioPlayerClient.getAudioPlayerClient().release(); // 如果你的单例支持重置,重新初始化实例 AudioPlayerClient.resetInstance(); // 需要在你的单例类里实现这个方法 }
三、修复有问题的音频文件本身
有些MP3文件可能存在格式头损坏、编码不标准的情况,系统自带播放器兼容性强能播放,但ExoPlayer的提取器严格遵循标准就会报错。你可以用FFmpeg重新编码这个文件,修复格式问题:
# 用FFmpeg重新编码MP3,生成标准格式的文件 ffmpeg -i "Selena Gomez & Marshmello - Wolves (DawnFoxes.com).mp3" -c:a libmp3lame "fixed_wolves.mp3"
替换原文件后再测试,应该能正常播放且不会影响后续操作。
四、全局监听播放器错误,自动恢复
在初始化AudioPlayerClient的时候,添加错误监听,一旦出现异常就自动重置播放器,避免影响后续使用:
// 初始化时添加错误监听 AudioPlayerClient.getAudioPlayerClient().player.listenToErrors().listen((errorEvent) { print("播放器全局错误: ${errorEvent.error}"); // 自动执行重置流程 _resetPlayer(); }); // 封装重置方法 Future<void> _resetPlayer() async { final player = AudioPlayerClient.getAudioPlayerClient(); await player.stop(); await player.release(); AudioPlayerClient.resetInstance(); }
问题根源解析
你的报错日志显示ExoPlayer的所有提取器都无法识别这个音频流,虽然系统播放器能兼容非标准格式,但ExoPlayer抛出异常后没有正确清理状态,导致单例播放器实例一直处于错误状态,后续播放请求无法被正常处理。
内容的提问来源于stack exchange,提问作者Shashan
相关产品推荐
相关产品推荐

