一区二区三区在线-一区二区三区亚洲视频-一区二区三区亚洲-一区二区三区午夜-一区二区三区四区在线视频-一区二区三区四区在线免费观看

服務器之家:專注于服務器技術及軟件下載分享
分類導航

node.js|vue.js|jquery|angularjs|React|json|js教程|

服務器之家 - 編程語言 - JavaScript - js教程 - js通過audioContext實現3D音效

js通過audioContext實現3D音效

2022-03-06 21:29莫兮是我 js教程

這篇文章主要為大家詳細介紹了js通過audioContext實現3D音效,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下

本文實例為大家分享了js通過audioContext實現3D音效的具體代碼,供大家參考,具體內容如下

前言

AudioContext的setPosition實現3D音效

效果展示

js通過audioContext實現3D音效

代碼展示

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
<!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

延伸 · 閱讀

精彩推薦
  • js教程JavaScript 語句之常用 for 循環詳解

    JavaScript 語句之常用 for 循環詳解

    這篇文章主要介紹了JavaScript 語句之常用 for 循環,本文給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下...

    js教程網10432022-02-21
  • js教程JavaScript實現4位隨機驗證碼的生成

    JavaScript實現4位隨機驗證碼的生成

    這篇文章主要為大家詳細介紹了JavaScript實現4位隨機驗證碼的生成,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下...

    weixin_4202683110532022-01-10
  • js教程前端經常會用到的JavaScript方法封裝

    前端經常會用到的JavaScript方法封裝

    前端經常會用到的JavaScript方法封裝都有哪些呢?我們一起來看一下吧!...

    Find一只程序猿11432021-12-30
  • js教程微信小程序自定義支持圖片的彈窗

    微信小程序自定義支持圖片的彈窗

    這篇文章主要為大家詳細介紹了微信小程序自定義支持圖片的彈窗,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下...

    歲末Zzz8432021-12-15
  • js教程微信小程序使用Echarts和分包的完整步驟

    微信小程序使用Echarts和分包的完整步驟

    這篇文章主要給大家介紹了關于微信小程序使用Echarts和分包的完整步驟,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價...

    little_little8342022-02-15
  • js教程js實現瀑布流布局(無限加載)

    js實現瀑布流布局(無限加載)

    這篇文章主要為大家詳細介紹了js實現瀑布流布局,無限加載,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下...

    噢,我明白了11262022-02-17
  • js教程NestJs使用Mongoose對MongoDB操作的方法

    NestJs使用Mongoose對MongoDB操作的方法

    這篇文章主要介紹了NestJs使用Mongoose對MongoDB操作的方法,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友...

    ragga-time4112022-01-22
  • js教程js使用Canvas將多張圖片合并成一張的實現代碼

    js使用Canvas將多張圖片合并成一張的實現代碼

    這篇文章主要介紹了js使用Canvas將多張圖片合并成一張的實現代碼,本文通過實例代碼給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值...

    weixin_4533717010362022-02-22
主站蜘蛛池模板: 成年人免费观看的视频 | 国产精品欧美亚洲韩国日本 | 国产美女做爰免费视频网址 | 色老大在线 | 91尤物在线 | 日韩欧美不卡片 | 国产极品精频在线观看 | 欧美日韩国产一区二区三区欧 | 超91精品手机国产在线 | 私人影院免费 | 亚洲乱码一二三四区国产 | 古装床戏做爰无遮挡三级 | 亚洲av欧美在我 | 好大好深视频 | 91精品国产美女福到在线不卡 | 97超pen个人视频公开视频视 | 四虎在线观看 | 国产成人www | 免费高清特黄a 大片 | 小早川怜子息梦精在线播放 | 高中生喷水喷浆 | 精品国产美女AV久久久久 | 日韩精品一区二区三区视频 | 午夜私人福利影院 | 青青草一区二区免费精品 | 日本草草视频在线观看 | 跪趴好紧h | 高清在线观看mv的网址免费 | 婷婷综合久久 | 国产视频a区 | 亚洲AV永久无码精品澳门 | 性做久久久久久久久浪潮 | 五月天狠狠 | 国产午夜亚洲精品理论片不卡 | 插鸡网站| 人人爱操| 日韩国产欧美一区二区三区 | 免费人成在线观看69式小视频 | 99在线观看视频免费精品9 | 国色天香 社区视频 | 国产麻豆剧果冻传媒影视4934 |