Chrome92创建HTMLAudioElement触发WebMediaPlayer上限报错解决方案问询
问题背景
浏览器端开发类数字音频工作站(DAW)产品,单标签页需要处理多个音频文件,此前使用new Audio(audioUrl)在自研音频混音器中播放音频,运行一直正常。升级至Chrome 92版本后,执行上述代码会抛出如下错误:
[Intervention] Blocked attempt to create a WebMediaPlayer as there are too many WebMediaPlayers already in existence.
已知Chrome后续版本会将webmediaplayers上限提升至1000,但业务场景需要支持超过1000条音频片段的播放需求。
可行规避方案
- 优先切换至 Web Audio API 实现
这是目前最适配超千条音频播放场景的长期方案,使用AudioBufferSourceNode播放音频不会占用WebMediaPlayer配额,完全不受数量限制。具体实现逻辑:- 提前请求音频文件,解码为
AudioBuffer做本地缓存 - 每次需要播放某段音频时,新建
AudioBufferSourceNode实例,绑定对应缓存的AudioBuffer,连接到AudioContext输出节点后调用start()即可播放 - 播放结束后
AudioBufferSourceNode会自动被垃圾回收,无残留资源占用
- 提前请求音频文件,解码为
- 临时兼容方案(暂无法切换Web Audio API时使用)
- 实现
HTMLAudioElement实例池:提前初始化固定数量的Audio实例,每次播放时从池中调取空闲实例,赋值新的音频地址播放,使用完毕后重置属性回收至池中,避免无限制创建新实例 - 主动清理废弃实例:不再使用的Audio实例,先调用
pause()暂停播放,再设置src = ''、移除所有绑定的事件监听,主动触发WebMediaPlayer资源回收,减少无效配额占用
- 实现
- 长音频场景适配方案
若业务包含长音频流式播放需求,无需全量解码为AudioBuffer,可复用少量HTMLMediaElementSourceNode绑定池化的Audio实例,同样能大幅降低WebMediaPlayer的创建数量,满足超长播放列表需求。
内容的提问来源于stack exchange,提问作者Nasik Shafeek
相关产品推荐
相关产品推荐

