夜猫子的知识栈 夜猫子的知识栈
首页
  • 前端文章

    • JavaScript
  • 学习笔记

    • 《JavaScript教程》
    • 《Web Api》
    • 《ES6教程》
    • 《Vue》
    • 《React》
    • 《TypeScript》
    • 《Git》
    • 《Uniapp》
    • 小程序笔记
    • 《Electron》
    • JS设计模式总结
  • 《前端架构》

    • 《微前端》
    • 《权限控制》
    • monorepo
  • 全栈项目

    • 任务管理日历
    • 无代码平台
    • 图书管理系统
  • HTML
  • CSS
  • Nodejs
  • Midway
  • Nest
  • MySql
  • 其他
  • 技术文档
  • GitHub技巧
  • 博客搭建
  • Ajax
  • Vite
  • Vitest
  • Nuxt
  • UI库文章
  • Docker
  • 学习
  • 面试
  • 心情杂货
  • 实用技巧
  • 友情链接
收藏
  • 分类
  • 标签
  • 归档
GitHub (opens new window)

夜猫子

前端练习生
首页
  • 前端文章

    • JavaScript
  • 学习笔记

    • 《JavaScript教程》
    • 《Web Api》
    • 《ES6教程》
    • 《Vue》
    • 《React》
    • 《TypeScript》
    • 《Git》
    • 《Uniapp》
    • 小程序笔记
    • 《Electron》
    • JS设计模式总结
  • 《前端架构》

    • 《微前端》
    • 《权限控制》
    • monorepo
  • 全栈项目

    • 任务管理日历
    • 无代码平台
    • 图书管理系统
  • HTML
  • CSS
  • Nodejs
  • Midway
  • Nest
  • MySql
  • 其他
  • 技术文档
  • GitHub技巧
  • 博客搭建
  • Ajax
  • Vite
  • Vitest
  • Nuxt
  • UI库文章
  • Docker
  • 学习
  • 面试
  • 心情杂货
  • 实用技巧
  • 友情链接
收藏
  • 分类
  • 标签
  • 归档
GitHub (opens new window)
  • canvas
  • clipboard
  • fetch
  • fontface
  • formdata
  • geolocation
  • headers
  • intersectionObserver
  • intl-relativetimeformat
  • intl-segmenter
  • offline
  • page-lifecycle
  • page-visibility
  • pointer-lock
  • postmessage
  • request
  • response
  • server-sent-events
  • service-worker
  • svg
  • url
  • urlpattern
  • urlsearchparams
  • web-share-api
  • webaudio
    • 基本用法
    • context.createBuffer()
    • 过滤器
  • webcomponents
  • websocket
  • 《Web Api》笔记
夜猫子
2024-09-06
目录

webaudio

# Web Audio API

Web Audio API 用于操作声音。这个 API 可以让网页发出声音。

# 基本用法

浏览器原生提供AudioContext对象,该对象用于生成一个声音的上下文,与扬声器相连。

const audioContext = new AudioContext();
1

然后,获取音源文件,将其在内存中解码,就可以播放声音了。

const context = new AudioContext();

fetch('sound.mp4')
  .then(response => response.arrayBuffer())
  .then(arrayBuffer => context.decodeAudioData(arrayBuffer))
  .then(audioBuffer => {
    // 播放声音
    const source = context.createBufferSource();
    source.buffer = audioBuffer;
    source.connect(context.destination);
    source.start();
  });
1
2
3
4
5
6
7
8
9
10
11
12

# context.createBuffer()

context.createBuffer()方法生成一个内存的操作视图,用于存放数据。

const buffer = audioContext.createBuffer(channels, signalLength, sampleRate);
1

createBuffer方法接受三个参数。

  • channels:整数,表示声道。创建单声道的声音,该值为 1。
  • signalLength:整数,表示声音数组的长度。
  • sampleRate:浮点数,表示取样率,即一秒取样多少次。

signalLength和sampleRate这两个参数决定了声音的长度。比如,如果取样率是1/3000(每秒取样3000次),声音数组长度是6000,那么播放的声音是2秒长度。

接着,使用buffer.getChannelData方法取出一个声道。

const data = buffer.getChannelData(0)
1

上面代码中,buffer.getChannelData的参数0表示取出第一个声道。

下一步,将声音数组放入这个声道。

const data = buffer.getChannelData(0)

// singal 是一个声音数组
// singalLengal 是该数组的长度
for (let i = 0; i < signalLength; i += 1) {
  data[i] = signal[i]
}
1
2
3
4
5
6
7

最后,使用context.createBufferSource方法生成一个声音节点。

// 生成一个声音节点
const node = audioContext.createBufferSource();
// 将声音数组的内存对象,放入这个节点
node.buffer = buffer;
// 将声音上下文与节点连接
node.connect(audioContext.destination);
// 开始播放声音
node.start(audioContext.currentTime);
1
2
3
4
5
6
7
8

默认情况下,播放一次后就将停止播放。如果需要循环播放,可以将节点对象的looping属性设为true。

node.looping = true;
1

# 过滤器

Web Audio API 原生提供了一些过滤器(filter),用来处理声音。

首先,使用context.createBiquadFilter方法建立过滤器实例。

const filter = audioContext.createBiquadFilter();
1

然后,通过filter.type属性指定过滤器的类型。

filter.type = 'lowpass';
1

目前,过滤器有以下这些类型。

  • lowpass
  • highpass
  • bandpass
  • lowshelf
  • highshelf
  • peaking
  • notch
  • allpass

然后指定过滤器的频率(frequency)属性。

filter.frequency.value = frequency
1

最后,过滤器实例连接节点实例,就可以生效了。

sourceNode.connect(filter);
1
编辑 (opens new window)
上次更新: 2024/9/6 12:14:45
web-share-api
webcomponents

← web-share-api webcomponents→

最近更新
01
IoC 解决了什么痛点问题?
03-10
02
如何调试 Nest 项目
03-10
03
Provider注入对象
03-10
更多文章>
Copyright © 2019-2025 Study | MIT License
  • 跟随系统
  • 浅色模式
  • 深色模式
  • 阅读模式