从音频元素中获取音频样本

时间:2013-11-06 06:40:16

标签: javascript node.js websocket html5-audio webrtc

我希望使用网络浏览器从麦克风获取实时音频,并通过websockets将其发送到Node.js服务器。我正在使用BinaryJS库将二进制数据发送到服务器。我在从麦克风获取音频样本时遇到问题。这就是我所拥有的:

window.AudioContext = window.AudioContext || window.webkitAudioContext;

var context = new AudioContext();
var audio = document.querySelector('audio');
navigator.webkitGetUserMedia({audio: true}, function(micstream){

    audio.src = window.URL.createObjectURL(micstream);

    }, errorCallback);

});

var errorCallback = function(e){
    console.log("Rejected!", e);
};

我想要一些方法来获取每10毫秒左右的音频样本,以便我可以将它写入websocket流。我正在寻找这样的东西:

function getSample(){
    //read the current data in byte buffer.

    setTimeout(getSample, 10);
}

有人能告诉我怎么做吗?或者还有另一种方法吗?谢谢!

1 个答案:

答案 0 :(得分:1)

这些要点可以让你走上正轨:

  • 您希望以原始方式发送数据,因此请从您的上下文中创建JavaScriptNodeScriptProcessor,并将onaudioprocess用于您的功能。您可以轻松设置时间间隔,以确保它只是每10毫秒。这与当前的RTCRecorders非常相似。
  • 默认情况下创建的数据包为float PCM。您可以在JavaScript中将它们转换为16 bit PCM,但值得称重的媒体库(我肯定知道Gstreamer)可以转换流。

这是code that I wrote。这段代码只是已经存在的记录器的修改版本,但是我通过websocket发送数据,我不在javascript中修改它,但是如果你需要的话,源代码中包含了从float转换为16bit PCM音频的功能。您可以在onaudioprocess中弹出时间检查并将websocket移出worker(目前只有Chrome支持工作线程中的WebSockets),您应该很高兴。