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

服務(wù)器之家:專注于服務(wù)器技術(shù)及軟件下載分享
分類導(dǎo)航

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

服務(wù)器之家 - 編程語言 - JavaScript - js教程 - js通過audioContext實(shí)現(xiàn)3D音效

js通過audioContext實(shí)現(xiàn)3D音效

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

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

本文實(shí)例為大家分享了js通過audioContext實(shí)現(xiàn)3D音效的具體代碼,供大家參考,具體內(nèi)容如下

前言

AudioContext的setPosition實(shí)現(xiàn)3D音效

效果展示

js通過audioContext實(shí)現(xiàn)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節(jié)點(diǎn)
        this.src = ctx.createBufferSource();
 
//    多個(gè)處理節(jié)點(diǎn)組
        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);
        }
    };
 
    //設(shè)置節(jié)點(diǎn)類型
    Aud.NODETYPE = {
        GNODE: 0 // 表示gainNode節(jié)點(diǎn)
    }
 
    //Aud管理對(duì)象
    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');
//    定義移動(dòng)點(diǎn)坐標(biāo)
    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>

以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持服務(wù)器之家。

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

延伸 · 閱讀

精彩推薦
  • js教程JavaScript 語句之常用 for 循環(huán)詳解

    JavaScript 語句之常用 for 循環(huán)詳解

    這篇文章主要介紹了JavaScript 語句之常用 for 循環(huán),本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下...

    js教程網(wǎng)10432022-02-21
  • js教程JavaScript實(shí)現(xiàn)4位隨機(jī)驗(yàn)證碼的生成

    JavaScript實(shí)現(xiàn)4位隨機(jī)驗(yàn)證碼的生成

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

    weixin_4202683110532022-01-10
  • js教程前端經(jīng)常會(huì)用到的JavaScript方法封裝

    前端經(jīng)常會(huì)用到的JavaScript方法封裝

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

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

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

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

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

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

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

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

    js實(shí)現(xiàn)瀑布流布局(無限加載)

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

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

    NestJs使用Mongoose對(duì)MongoDB操作的方法

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

    ragga-time4112022-01-22
  • js教程js使用Canvas將多張圖片合并成一張的實(shí)現(xiàn)代碼

    js使用Canvas將多張圖片合并成一張的實(shí)現(xiàn)代碼

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

    weixin_4533717010362022-02-22
主站蜘蛛池模板: 日韩欧美一区二区在线 | 久久精品国产亚洲AV麻豆欧美玲 | 欧美 国产 日韩 第一页 | 日本韩国一区二区三区 | 国产成+人+综合+欧美 亚洲 | 日韩精品视频在线播放 | caoporm碰最新免费公开视频 | 美女扒开腿让男人桶爽动态图片 | 亚洲好视频| 久久电影院久久国产 | 青青草精品在线观看 | 男神插曲女生动漫完整版动漫 | 国产成人影院在线观看 | 欧美日韩亚洲高清不卡一区二区三区 | 动漫美女被吸乳羞羞小说 | 亚洲国产精品日本无码网站 | 2012在线观看免费视频大全 | 日韩欧美一区二区三区免费观看 | 荡女淫春2古装 | 男人的天堂在线观看入口 | 国产精品suv一区二区 | 思思玖玖玖在线精品视频 | 久久人妻少妇嫩草AV無碼 | 九九99亚洲精品久久久久 | bbbxxx乱大交欧美小说 | 成年男女免费视频 | 蜜桃在线 | 美国玩尿眼道videos | www.毛片在线观看 | 500第一精品 | 香蕉久久一区二区三区 | 国产伦久视频免费观看视频 | 国产伦精品一区二区三区免费观看 | 97色蜜桃 | china外卖员gay帮口 | 亚洲人的天堂男人爽爽爽 | 视频一区二区在线 | 亚洲精品国产国语 | 婷婷综合缴情亚洲五月伊 | 精品无码国产污污污免费网站2 | 接吻吃胸摸下面啪啪教程 |