捕获音频客户端
您可以使用Web Audio API 和getUserMedia(通常被认为是WebRTC 功能集的一部分)从用户那里捕获音频(和视频,如果需要的话)。这是来自excellent HTML5Rocks.com tutorial on getUserMedia的代码示例:
window.AudioContext = window.AudioContext ||
window.webkitAudioContext;
var context = new AudioContext();
navigator.getUserMedia({audio: true}, function(stream) {
var microphone = context.createMediaStreamSource(stream);
var filter = context.createBiquadFilter();
// microphone -> filter -> destination.
microphone.connect(filter);
filter.connect(context.destination);
}, errorCallback);
在此示例中,我们要求用户访问他们的“麦克风”。如果他们给我们,我们使用 AudioContext::createMediaStreamSource() 创建一个常规的 AudioNode。一旦我们有了这个节点,它就可以连接到链中的其他节点,让你可以用它做任何你想做的事情。
这需要现代浏览器。目前只有 Chrome 和 Firefox 同时支持这两个功能。 (检查Web Audio 和getUserMedia 的更新兼容性,但请注意,仅仅因为浏览器支持两者并不能保证它会工作。)此外,您可能需要解决一些浏览器怪癖。最让我烦恼的是Chrome issue where your nodes are garbage collected while they are still in use。 Firefox 的 SplitterNode 也存在问题,其中并非所有通道都有效。检测浏览器支持也不总是那么简单,因为一些浏览器(尤其是 Android 上的 Chrome)声称支持甚至运行您的 AudioContext,但只是从 getUserMediaStream 返回空样本。简而言之,到处进行测试,如果遇到问题,不要指望从浏览器开发人员那里得到太多帮助。是not an adopted standard yet(但相当成熟)。
低延迟、多通道和采样率现实
您无法控制延迟。您无法检测到实际的声音设备。您所能确定的只是浏览器是否允许您访问音频通道,以及它们的数量。我还发现,不管另一边是什么,Chrome 只会打开一个立体声通道。 (它还将单声道设备视为立体声,将第一个通道复制到 L 和 R 通道。)Firefox 也有类似的问题。
ASIO support is non-existent at the moment。 (我考虑过编写一个浏览器扩展来支持它,但这并不能解决延迟问题,除非有人将本机扩展编译到浏览器中。)浏览器使用的操作系统 API 完全不受您的控制。在 Windows 上的 Chrome 中,您可以 force it to use exclusive mode 一直是 tested to around 4ms (您的里程肯定会有所不同)。不过你不能依赖这个。
最后,采样率完全不受您的控制。您可以通过检查AudioContext.sampleRate 来确定它。每个会话的采样率是固定的。您还可以通过调整默认采样率的系统设置来修改采样率。确保将您的输入和输出速率设置为相同,否则您将无法获得任何音频输出(至少在 Chrome 上)。
获取数据到服务器
您可以创建一个script processing node,然后通过二进制 websocket 将此数据转储回您的服务器。为此,我将 BinaryJS 与后端的 Node.js 一起使用,因为它可以在单个实际 WebSocket 连接下多路复用多个流。 (我需要其他流来控制。如果你不需要,也许你不需要 BinaryJS。)
所有 WebAudio 样本都是 Float32。在通过线路发送之前,我将这些转换为 16 位有符号整数以节省带宽。如果您选择按原样通过线路发送浮点数,您应该注意到endianess does matter 很遗憾。小心转换。
希望这可以为您节省一些研究时间。 Web Audio API 确实是可靠的东西,但基础总是在变化。上周坏掉的东西可以在本周修复,反之亦然。在浏览器上保持最新状态并获取测试版副本以进行测试。