网络声卡检测

时间:2014-01-12 20:34:17

标签: audio audio-streaming

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

1 个答案:

答案 0 :(得分:6)

捕获音频客户端

您可以使用Web Audio APIgetUserMedia(通常被视为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 AudiogetUserMedia的更新兼容性,但请注意,仅仅因为浏览器支持两者并不能保证它能够正常工作。)此外,还有一些浏览器怪癖可能需要解决。最让我烦恼的是Chrome issue where your nodes are garbage collected while they are still in use。 Firefox也存在SplitterNode的问题,而且并非所有通道都能正常工作。检测浏览器支持并不总是很简单,因为某些浏览器(特别是Android上的Chrome)声称支持甚至运行您的AudioContext,但只是从getUserMediaStream返回null样本。简而言之,在任何地方进行测试,如果遇到问题,请不要期望从浏览器开发人员那里得到很多帮助。它是not an adopted standard yet(但已经非常成熟)。

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

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

ASIO support is non-existent at the moment。 (我考虑过编写一个浏览器扩展来支持它,但这不会解决延迟问题,除非有人将本机扩展编译到浏览器中。)浏览器使用的OS API完全不受你的控制。在Windows上的Chrome中,您可以force it to use exclusive mode tested to around 4ms(您的milage肯定会有所不同)。你不能依赖这个。

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

将数据提供给服务器

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

所有WebAudio示例都是Float32。我将这些转换为16位有符号整数,然后通过线路发送以节省带宽。如果您选择按原样通过电线发送浮点数,您应该注意到endianess does matter。仔细转换。

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