从音频元素获取音频样本

8
我希望使用Web浏览器从麦克风获取实时音频并通过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);
}

有人能告诉我如何做到这一点吗?或者还有其他方法可以实现吗?谢谢!


这可能会对您有所帮助:http://typedarray.org/from-microphone-to-wav-with-getusermedia-and-web-audio/ - user1693593
我之前看了这篇帖子。问题在于这段代码将数据转换为本地的WAV文件。我想要实现的是将麦克风音频直接传送到WebSocket服务器。 - drcocoa
直接将数据推送到您的Web套接字连接,跳过转换为wav的步骤? - user1693593
1
你可能想要查看Recorderjs或MediaStream Recording API(在Firefox Nightly中实现,Chrome有意实现):http://webaudiodemos.appspot.com/AudioRecorder/index.html; http://simpl.info/mr - Sam Dutton
@Ken-AbdiasSoftware 我尝试将其推送到服务器。在服务器上重新组装并从中创建wav文件。但是我遇到了有关无法读取流数据的错误。我正在努力修复它。 - drcocoa
当你创建createObjectURL时,它会有一些额外的东西,而不仅仅是音频数据。因此,您需要找到一种将音频流转换为纯二进制而不是ObjectURL的方法。 - moka
1个回答

1
这些要点应该能让你走上正确的道路:
  • 你想要发送原始数据,所以从你的上下文中创建一个JavaScriptNodeScriptProcessor并利用onaudioprocess来调用你的函数。你可以轻松地设置时间间隔,以确保每个间隔是10毫秒。这与当前RTCRecorders所做的非常相似。
  • 默认情况下创建的包是float PCM。你可以在JavaScript中将它们转换为16 bit PCM,但值得一提的媒体库(我确定Gstreamer)可以翻译流。

这里是我编写的代码。这个代码只是现有记录器的修改版本,但我通过websocket发送数据,而且不在javascript中进行修改,但如果需要,将从浮点数转换为16位PCM音频的函数包含在源代码中。你可以在onaudioprocess中加入时间检查,并将websocket移出worker(目前只有Chrome支持Worker线程中的WebSockets),然后就可以使用了。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接