录制麦克风源的音频

要从用户的麦克风录制音频,我们必须首先获得用户访问设备的许可:

navigator.mediaDevices.getUserMedia({ audio: true })
    .then(successCallback)
    .catch(failureCallback);

成功之后,我们将使用 MediaStream 对象调用 successCallback,我们可以用它来访问麦克风:

var audioContext = new (window.AudioContext || window.webkitAudioContext)();
// Create a source from our MediaStream
var source = audioContext.createMediaStreamSource(mediaStream);
// Now create a Javascript processing node with the following parameters:
// 4096 = bufferSize (See notes below)
// 2 = numberOfInputChannels (i.e. Stereo input)
// 2 = numberOfOutputChannels (i.e. Stereo output)
var node = audioContext.createScriptProcessor(4096, 2, 2);
node.onaudioprocess = function(data) {
    console.log(data);
}
// Connect the microphone to the script processor
source.connect(node);
node.connect(audioContext.destination);

onaudioprocess 事件使我们能够从麦克风访问 Raw PCM 数据流。我们可以像这样访问缓冲数据:

node.onaudioprocess = function(data) {
    var leftChannel = data.inputBuffer.getChannelData(0).buffer;
    var rightChannel = data.inputBuffer.getChannelData(1).buffer;
}

当我们完成录制时,我们必须断开与源的连接并丢弃脚本处理器:

node.disconnect();
source.disconnect();

关于 bufferSize 的重要说明

bufferSize 确定调用 onaudioprocess 回调的频率。较低的值会导致较低(较好)的延迟,较高的值会减少音频分解/毛刺。值为零将允许浏览器实现选择适当的值。如果手动传入,则必须是以下值之一:256,512,1024,2048,4096,8192,16384。