錄製麥克風源的音訊

要從使用者的麥克風錄製音訊,我們必須首先獲得使用者訪問裝置的許可:

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。