web-audio api ConvolverNode 使用心得
现在网上有很多关于web-audio的资料
MDN有很多介绍MDN Web Docs如果有需要请前往查看api,这篇是关于ConvolverNode的。
ConvolverNode 接口是一个对给定 AudioBuffer 上执行线性卷积的 AudioNode,一般用来做音频混响效果。这是MDN对它的介绍。
简单介绍一下它,毕竟我也并不是很懂。
它实现的是audioNoded 接口,一输入一输出,存在两个特性
- buffer 是一个aduioBuffer,简单来说就是创建混响效果的脉冲文件。这里需要注意的是格式要为无损音质的,例如wav、ir。有损的行不行?也不是不行,就是耳朵受不了,有专门的混响脉冲文件。
- normalize 是一个Boolean,简单来说就是混响要不要平滑一点。
这样链接就行了
那我们怎么去实现混响呢?
首先来说,它是对于给定的AudioBuffer上执行线性卷积。
ConvolverNode.buffer它并不是我们要执行线性卷积的源,而是我们的处理卷积。当一个audioNode 接入 ConvolverNode后,输出后就是已经处理后的音频。
demo代码
// 创建源
const url = '' // 你的音频地址
const AudioCtx = new AudioContext()
const source = AudioCtx.createBufferSource()
const request = new XMLHttpRequest()
request.open('GET', url, true)
request.setRequestHeader("Accept", "*/*")
request.responseType = 'arraybuffer'
request.onload = function () {
var audioData = request.response
AudioCtx.decodeAudioData(audioData, function (buffer) {
source.buffer = buffer
initConvolver()
},
function (e) { "Error with decoding audio data" + e.err })
}
request.send()
// 初始化混响
function initConvolver() {
const url = '/files/ir1.wav'
var request = new XMLHttpRequest()
request.open('GET', url, true)
request.setRequestHeader("Accept", "*/*")
request.responseType = 'arraybuffer'
request.onload = function () {
var audioData = request.response
AudioCtx.decodeAudioData(audioData, function (buffer) {
convolver.buffer = buffer
source.connect(convolver)
convolver.connect(AudioCtx.destination)
source.start(0)
},
function (e) { "Error with decoding audio data" + e.err })
}
request.send()
}