网络声卡检测

Xen*_*ius 4 audio audio-streaming

我们需要一些业余爱好网络项目.在这个阶段,我们想要检测客户端的声卡,并将来自声卡的任何声音指向服务器以处理音频.低延迟对我们来说是一个重要问题.所以我们需要你的语言,图书馆等建议.如果你能给我们一些关于大局的信息,那么我们可以自己研究.

Bra*_*rad 6

捕获音频客户端

您可以将Web Audio APIgetUserMedia(通常被视为WebRTC功能集的一部分)一起使用,以从用户捕获音频(和视频,如果您需要).以下是getUserMedia上优秀HTML5Rocks.com教程的代码示例:

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);
Run Code Online (Sandbox Code Playgroud)

在此示例中,我们要求用户访问其"麦克风".如果他们给我们,我们使用AudioContext :: createMediaStreamSource()创建一个常规的AudioNode.一旦我们有了这个节点,它就可以连接到链中的其他节点,允许你随心所欲地做任何事情.

这需要一个现代的浏览器.目前只有Chrome和Firefox一起支持这两种功能.(检查Web AudiogetUserMedia的更新兼容性,但请注意,仅因为浏览器支持两者并不能保证它能够正常工作.)此外,还有一些浏览器怪癖可能需要解决.最让我烦恼的是Chrome问题,您的节点在使用时会被垃圾收集.Firefox也存在SplitterNode的问题,而且并非所有通道都能正常工作.检测浏览器支持也并非总是如此,因为某些浏览器(特别是Android上的Chrome)声称支持甚至运行您的AudioContext,但只是从getUserMediaStream返回null样本.简而言之,在任何地方进行测试,如果遇到问题,请不要期望从浏览器开发人员那里得到很多帮助.它还不是采用的标准(但已经相当成熟).

低延迟,多通道和采样率现实

您无法控制延迟.您无法检测实际的声音设备.您可以确定的是,浏览器是否允许您访问音频通道,以及其中有多少通道.我还发现,无论另一方是什么,Chrome都只会打开立体声频道.(它还将单声道设备视为立体声,将第一个频道复制到L和R频道.)Firefox也存在类似问题.

ASIO支持目前不存在.(我考虑过编写一个浏览器扩展来支持它,但这不会解决延迟问题,除非有人将本机扩展编译到浏览器中.)浏览器使用的OS API完全不受您的控制.在Windows上的Chrome中,您可以强制它使用已经测试到大约4毫秒的独占模式(您的milage肯定会有所不同).你不能依赖这个.

最后,采样率完全超出您的控制范围.您可以通过检查确定它AudioContext.sampleRate.采样率是每个会话固定的.您还可以通过调整默认采样率的系统设置来修改采样率.确保将输入和输出速率设置为相同,否则您将无法获得任何音频输出(至少在Chrome上).

获取数据到服务器

您可以创建脚本处理节点,然后通过二进制websocket将此数据转储回服务器.我在后端使用BinaryJS和Node.js,因为它可以在一个实际的WebSocket连接中复用多个流.(我需要其他流来控制.如果你不需要,也许你不需要BinaryJS.)

所有WebAudio示例都是Float32.我将这些转换为16位有符号整数,然后通过线路发送以节省带宽.如果您选择按原样在线上发送浮点数,您应该注意到,不幸的是,endianess 无关紧要.仔细转换.

希望这能为您节省一些研究时间.Web Audio API是非常可靠的东西,但地面总是在变化.上周爆出的东西本周可以修复,反之亦然.及时了解浏览器并获取测试版的测试副本.