cyy010818 2023-02-10 17:04 采纳率: 25%
浏览 145
已结题

使用canvas+web audio时出现HTMLMediaElement已经连接到不同的MediaElementSourceNode

使用canvas+web audio制作动态音频时出现Failed to execute 'createMediaElementSource' on 'AudioContext': HTMLMediaElement already connected previously to a different MediaElementSourceNode报错。该如何解决呢,代码如下:

    <div class="player_page">
        <canvas id="canvas">
        </canvas>
    </div>
```html

let ctx = canvas.getContext('2d');
canvas.width = window.innerWidth;
canvas.height = window.innerHeight;

let audioArray = [
    '../music/1.mp3',
    '../music/2.mp3',
    '../music/3.mp3',
    '../music/4.mp3',
    '../music/4.mp3',
    '../music/4.mp3',
    '../music/4.mp3',
    '../music/4.mp3'
];
let audioNum = 0;
let oAudio = document.getElementById('music_mp3');
oAudio.crossOrigin = 'anonymous';
oAudio.src = audioArray[audioNum];

// 获取canvas元素宽高
let WIDTH = canvas.width;
let HEIGHT = canvas.height;
let Play=document.getElementById('play');
Play.onclick=function(){
    let oCtx = new AudioContext();
    let audioSrc = oCtx.createMediaElementSource(oAudio);
    let analyser=oCtx.createAnalyser();
    audioSrc.connect(analyser);
    analyser.connect(oCtx.destination);
    analyser.fftSize=512;
    let bufferLength=analyser.frequencyBinCount;
    let dataArray=new Uint8Array(bufferLength);
    let barWidth=(WIDTH/bufferLength)-1;
    let barHeight;
    function draw(){
        analyser.getByteFrequencyData(dataArray);
        let x=0;
        ctx.clearRect(0,0,WIDTH,HEIGHT);
        for(let i=0;i<bufferLength;i++){
            barHeight=dataArray[i];
            ctx.fillStyle='rgb(228,255,255)';
            ctx.fillRect(x,HEIGHT,barWidth,-barHeight);
            x+=barWidth+1;
        }
        window.requestAnimationFrame(draw);
    };
    draw();
}
  • 写回答

9条回答 默认 最新

  • zzwwtyyds 2023-02-10 18:03
    关注

    这个错误通常是因为在使用 HTMLMediaElement 创建音频源时,该元素已经被连接到了其他 MediaElementSourceNode 。

    解决方案是在连接 MediaElementSourceNode 前,将 HTMLMediaElement 与任何现有连接断开,或者在使用完 HTMLMediaElement 后,使用MediaElementSourceNode.disconnect()方法断开连接。

    例如:

    img

    这应该解决您的问题。如果仍然存在问题,请考虑检查您的代码,以确保没有在同一时间连接多个 MediaElementSourceNode 到 HTMLMediaElement。

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(8条)

报告相同问题?

问题事件

  • 系统已结题 2月23日
  • 已采纳回答 2月15日
  • 赞助了问题酬金15元 2月10日
  • 创建了问题 2月10日

悬赏问题

  • ¥20 西门子S7-Graph,S7-300,梯形图
  • ¥50 用易语言http 访问不了网页
  • ¥50 safari浏览器fetch提交数据后数据丢失问题
  • ¥15 matlab不知道怎么改,求解答!!
  • ¥15 永磁直线电机的电流环pi调不出来
  • ¥15 用stata实现聚类的代码
  • ¥15 请问paddlehub能支持移动端开发吗?在Android studio上该如何部署?
  • ¥20 docker里部署springboot项目,访问不到扬声器
  • ¥15 netty整合springboot之后自动重连失效
  • ¥15 悬赏!微信开发者工具报错,求帮改