解决AudioCont...HTMLMediaElement already connected previously to a different MediaElementSourceNode.问题

很久没有写过东西了,最近在帮朋友搞一个音乐方面的站点,因为涉及到H5播放音乐,所以考虑增加音频视觉效果更棒些,可是在使用canvas+AudioContext创建音乐播放可视化效果的时候,发现只要audio音频暂停后再次点击播放,浏览器就会报下面的错误:

Uncaught DOMException: Failed to execute 'createMediaElementSource' on 'AudioContext': HTMLMediaElement already connected previously to a different MediaElementSourceNode.
    at analyzerInitialize (https://.../app.js?ver=1.6:40:25)
    at HTMLDivElement.<anonymous> (https://.../app.js?ver=1.6:79:3)
    at HTMLDivElement.dispatch (https://.../jquery.min.js?ver=1.6.87.30:3:12444)
    at r.handle (https://.../jquery.min.js?ver=1.6.87.30:3:9173)
    at C (https://...min.js?ver=1.6.87.30:6:6769)
    at HTMLDocument.T (https://...min.js?ver=1.6.87.30:6:8938)

虽然不影响手机浏览器执行(用户几乎看不到),但是作为一只程序猿怎么会允许自己写的东西飘红呢?

 

于是开始各种排查,通过报错信息不难发现是因为HTMLMediaElement被占用而导致的,也就是说audio相关的元素已经被使用,当暂停以后再次点击播放的时候,加载createMediaElementSource(audio)就会造成错误,因为不是科班出身,无法用专业的语言来描述,勉强举个例子,用vue等前端框架经常遇到的插槽冲突的道理是一样的。知道了问题是怎么发生的,那么解决起来就相对简单了。html代码中编写的<audio>标签是固定的,那么如果使用javascript去创建标签,对于JS来讲每次创建的就都不一样了,于是删除html里面的audio标签,在原来的位置创建了一个id=audio_container的div,然后在JS里面加上:

......
//新增下面一行,用于通过JS创建audio元素
document.getElementById('audio_container').innerHTML = '<audio id=\"audio\"></audio>';
var audio = $('#audio');
	audio.src = playUrl;
......
    var audioSrc = actx.createMediaElementSource(audio);
......

保存后清空缓存重新加载,OK,红彤彤的一片不见了!哈哈,文章写的乱七八糟,希望能给遇到同样问题的朋友们一点提示,也给自己做个备忘。

洗洗赶紧睡了~

 

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Jarry_

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值