好得很程序员自学网

<tfoot draggable='sEl'></tfoot>

js通过audioContext实现3D音效

本文实例为大家分享了js通过audioContext实现3D音效的具体代码,供大家参考,具体内容如下

前言

AudioContext的setPosition实现3D音效

效果展示

代码展示

?

<!DOCTYPE html>

< html lang = "en" >

< head >

     < meta charset = "UTF-8" >

     < title >3D Audio</ title >

     < style >

         body, div{

             margin: 0px;

             padding: 0px;

             text-align: center;

         }

 

         #cav{

             border: 1px solid black;

             border-radius: 4px;

             margin: 10px auto;

         }

     </ style >

</ head >

< body >

< canvas id = "cav" width = "320" height = "200" ></ canvas >

</ body >

< script >

     let Aud = function (ctx, url) {

         this.ctx = ctx;

         this.url = url;

 

//    source节点

         this.src = ctx.createBufferSource();

 

//    多个处理节点组

         this.pNode = [];

     };

 

     Aud.prototype = {

         output(){

             for (let i = 0; i < this.pNode.length ; i++){

                 let tNode = this .src;

                 for (let j = 0 ; j < this.pNode[i].length; j++){

                     tNode.connect(this.pNode[i][j]);

                     tNode = this .pNode[i][j];

                 }

                 tNode.connect(this.ctx.destination);

             }

         },

 

         play(loop){

             this.src.loop = loop || false;

             this.output();

             this.src.start(0);

         },

 

         stop() {

             this.src.stop();

         },

 

         addNode(node, groupIdx = 0 ){

             this.pNode[groupIdx] = this.pNode[groupIdx] || [];

             this.pNode[groupIdx].push(node);

         }

     };

 

     //设置节点类型

     Aud.NODETYPE = {

         GNODE: 0 // 表示gainNode节点

     }

 

     //Aud管理对象

     AudManager = {

         urls: [],

         items: [],

         ctx: null,

         init(){

             try{

                 this.ctx = new AudioContext();

             }catch (e) {

                 console.log(`${e}`);

             }

         },

         load(callback){

             for (let i = 0 ; i < this.urls.length; i++){

                 this.loadSingle(this.urls[i], callback);

             }

         },

 

         loadSingle(url, callback){

             let req = new XMLHttpRequest();

             req.open('GET', url, true);

             req.responseType = 'arraybuffer' ;

             let self = this ;

             req.onload = function () {

                 self.ctx.decodeAudioData(this.response)

                     .then(

                         buf => {

                             let aud = new Aud(self.ctx, url);

                             aud.src.buffer = buf;

                             self.items.push(aud);

 

                             if (self.items.length == self.urls.length){

                                 callback();

                             }

                         },

                         err => {

                             console.log(`decode error:${err}`);

                         }

                     )

             };

 

             req.send();

         },

 

         createNode(nodeType, param){

             let node = null;

             switch (nodeType) {

                 case 1:

                     node = this.ctx.createPanner();

                     break;

                 case 2:

                     node = this.ctx.createScriptProcessor(param[0], param[1], param[2]);

                     break;

                 default:

                     node = this.ctx.createGain();

             }

             return node;

         }

     };

 

     let ctx = document.getElementById('cav').getContext('2d');

//    定义移动点坐标

     let cX = 190,

         cY = 100,

         deg = 0;

 

     window.onload = function (){

         init();

     }

 

     function renderCir(x, y, r, col){

         ctx.save();

         ctx.beginPath();

         ctx.arc(x, y, r, 0, Math.PI*2);

         ctx.closePath();

 

         ctx.fillStyle = col;

         ctx.fill();

         ctx.restore();

     }

 

     function renderCenter(){

         renderCir(160, 100, 8, "red");

     }

 

     function renderCat() {

         renderCir(cX, cY, 8, "blue");

     }

 

     function init(){

         AudManager.urls = ["test.mp3"];

         AudManager.init();

 

         AudManager.load(()=>{

             let pNod1 = AudManager.createNode(1);

             let sound1 = AudManager.items[0];

 

             sound1.addNode(pNod1);

             sound1.play(true);

             timeHandle();

         });

     }

 

     function timeHandle() {

         window.setInterval(()=>{

             ctx.clearRect(0,0,320,200);

             let rad = Math.PI*deg / 180;

             let sx = 90*Math.cos(rad),

                 sy = 90*Math.sin(rad);

             cX = 160 + sx;

             cY = 100 + sy;

 

             AudManager.items[0].pNode[0][0].setPosition(sx*0.1, -sy*0.1, 0);

             renderCenter();

             renderCat();

             deg++;

         }, 30);

     }

</ script >

</ html >

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持服务器之家。

原文链接:https://blog.csdn.net/u013362192/article/details/115475541

dy("nrwz");

查看更多关于js通过audioContext实现3D音效的详细内容...

  阅读:38次