Xen*_*ius 4 audio audio-streaming
我们需要一些业余爱好网络项目.在这个阶段,我们想要检测客户端的声卡,并将来自声卡的任何声音指向服务器以处理音频.低延迟对我们来说是一个重要问题.所以我们需要你的语言,图书馆等建议.如果你能给我们一些关于大局的信息,那么我们可以自己研究.
您可以将Web Audio API与getUserMedia(通常被视为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 Audio和getUserMedia的更新兼容性,但请注意,仅因为浏览器支持两者并不能保证它能够正常工作.)此外,还有一些浏览器怪癖可能需要解决.最让我烦恼的是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是非常可靠的东西,但地面总是在变化.上周爆出的东西本周可以修复,反之亦然.及时了解浏览器并获取测试版的测试副本.
| 归档时间: |
|
| 查看次数: |
3586 次 |
| 最近记录: |