The onended event handler for the AudioScheduledSourceNode interface specifies an event handler to be executed when the ended event occurs on the node. This event is sent to the node when the concrete interface (such as AudioBufferSourceNode, OscillatorNode, or ConstantSourceNode) determines that it has stopped playing. The ended event is only sent to a node configured to loop automatically when the node is stopped using its stop() method. This is the case, for example, when using an AudioBufferSourceNode with its loop property set to true.
该节点代表声音输出,由 audioContext.createMediaStreamDestination() 创建
由于代表声音的输出节点,所以该节点不能再使用 connect 方法去连接其他节点,否则会报错
Uncaught DOMException: Failed to execute 'connect' on 'AudioNode': output index (0) exceeds number of outputs (0).
AudioContext - 让你的项目跟随音乐律动起来
参考文章:
前言
想在项目中添加一个音乐播放器,起初用
<audio />
标签试了一下,结果发现在 chrome / safari 等各类浏览器都报错了。无奈之下,转头看向了另一个音频播放 - AudioContext。由于个人对 AudioContext 并不熟悉,因此本篇仅简单介绍 AudioContext 以及如何用它完成一个简易的音乐播放功能。AudioContext 构造函数
AudioContext 本质是一个构造函数。 在使用时,第一步先实例化 audioContext 对象:
示例:
audioContext 实例
AudioContext 实例的属性:
AudioNode 通用模块
AudioNode 是一个处理音频的通用模块,在实际应用中我们不会直接使用AudioNode,而是使用AudioNode的子类们,AudioNode的子类很多,均通过调用 audioContext 实例的创建方法得到:
AudioNode 模块的处理方式是链式的,每个 AudioNode 代表一个处理声音的模块(比如音量GainNode,音源AudioSourceNode),一个 AudioNode 处理完成后交由下个 AudioNode 来处理,传递的方式由
audioNode1.connect(audioNode2)
来实现。AudioBufferSourceNode
该节点代表音源,由
audioContext.createBufferSource()
方法创建 节点创建后需要往其buffer
属性上挂载需要播放的数据 (解码后的音频数据) 除了buffer
属性外,还有一些其他的属性:还有一个方法,一个事件
参考官方API,解释如下:
AudioDestinationNode
该节点代表声音输出,由
audioContext.createMediaStreamDestination()
创建 由于代表声音的输出节点,所以该节点不能再使用 connect 方法去连接其他节点,否则会报错Uncaught DOMException: Failed to execute 'connect' on 'AudioNode': output index (0) exceeds number of outputs (0).
属性: maxChannelCount(read-only):返回设备可以处理的最大通道数;
GainNode
该节点代表音量控制,由
audioContext.createGain()
创建 可以通过设置gainNode.gain.value
的值来设置音量,值的范围是 [0, 1]此外,还有一些节点和功能,请参考 AudioContext入入入门 学习,此处不再详细讲解。
实战:创建一个音频播放 demo
demo 流程:axios 请求音频数据 (arraybuffer 类型) => 音频解码 (调用 decodeAudioData 实例的 ) => AudioBufferSourceNode(把解码后的数据挂载到音源上) => 通过audioContext.destination 交由硬件播放