我正在使用带有网络音频 api 的麦克风输入,需要获取音量值。
现在我已经让麦克风工作了: http://updates.html5rocks.com/2012/09/Live-Web-Audio-Input-Enabled
此外,我知道有一种方法可以控制音频文件的音量: http://www.html5rocks.com/en/tutorials/webaudio/intro/
// Create a gain node.
var gainNode = context.createGain();
// Connect the source to the gain node.
source.connect(gainNode);
// Connect the gain node to the destination.
gainNode.connect(context.destination);
// Reduce the volume.
gainNode.gain.value = 0.5;
但是如何将这两者结合起来得到输入音量值呢? 我只需要这个值,不需要操纵它。
有人知道吗?
最佳答案
想要获得“音量”的主要原因有两个:
- 检测 源何时“削波” - 即信号的绝对值超过预设水平(通常非常接近 1.0),此时它将开始削波。
- 让用户感觉他们的信号有多大。
我之所以单独列出这些是因为第一个要求您处理每个 样本——否则您可能会错过一个短暂的瞬变。为此,您需要使用 ScriptProcessor
节点,并且必须遍历 onaudioprocess
内缓冲区中的每个样本,以查找剪辑上方的绝对值等级。您可以然后也只确定 RMS 水平 - 只需将每个样本的平方相加,除以 N,然后取平方根。 不要从 onaudioprocess
中渲染,不过 - 设置您在 requestAnimationFrame
上访问的值。
您还可以使用 AnalyserNode
进行电平检测,然后对数据进行平均,有点像 other answer does使用 getAverageVolume
。然而,另一个答案是 NOT ScriptProcessor
的良好使用 - 事实上,它根本不处理脚本节点,甚至不传递数据,它只是像定时器回调一样使用它。通过使用 requestAnimationFrame
作为视觉回调,您可以FAR 得到更好的服务;永远不要像这样从 onaudioprocess
内部设置布局或视觉参数,否则你会乞求破坏你的音频系统。如果您不需要剪辑检测,只需在 AnalyserNode
上执行 getByteFrequencyCount
/getAverageVolume
(但您应该尽量减少频段数量在分析器中 - 64 是最小值,我认为),你应该预先分配和重用 Uint8Array
而不是每次都分配它(这会增加垃圾收集)。
关于javascript - 如何使用网络音频 api 获取麦克风输入音量值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21247571/