使用AudioContext将来自avconv的音频通过NodeJs WebSockets流式传输到Chrome

时间:2013-11-27 18:39:56

标签: node.js audio websocket avconv webkitaudiocontext

我们在浏览器中播放流式音频时遇到问题(使用Chrome)。

我们有一个流程在某个端口上的udp上传输一些音频(例如互联网广播)。这是avconv(avconv -y -i SOMEURL -f alaw udp://localhost:PORT)。 我们有一个NodeJs服务器接收这个音频流并将其转发到通过websockets连接的多个客户端。 NodeJs接收的音频流被包装在一个缓冲区中,该缓冲区是一个数字从0到255的数组。数据被发送到浏览器没有任何问题,然后我们使用AudioContext在浏览器中播放音频流(我们的代码基于AudioStreamer - https://github.com/agektmr/AudioStreamer)。

起初,我们在这一点上得到的一切都是静态的。在查看AudioStreamer代码时,我们意识到音频流数据应该在-1到1范围内。有了这些知识,我们尝试使用此公式x = (x/128) - 1修改缓冲区中的每个值。我们这样做只是为了看看会发生什么,而且令人惊讶的是静态变得有点不那么糟 - 如果音频是语音,你甚至可以制作出歌曲或单词的旋律。但它仍然非常非常糟糕,很多静态,所以这显然不是一个解决方案 - 但它确实表明我们确实通过websockets接收音频流,而不仅仅是一些随机数据。

所以问题是 - 我们做错了什么?是否有我们应该使用的编解码器/格式?当然,所有代码(avconv,NodeJ和客户端)都可以随意修改。如果需要,我们也可以使用另一个浏览器,虽然我认为这不是问题。我们唯一知道的是我们真的需要这个来完成websockets。

运行avconv和NodeJs的操作系统是Ubuntu(各种版本10-13)

有什么想法吗?所有帮助将不胜感激。

谢谢! 托马斯

1 个答案:

答案 0 :(得分:0)

从整数样本到浮点样本的转换不正确。你必须考虑到:

  • 频道数
  • 每个样本的位数
  • 符号/无符号
  • 字节序

假设你有一个典型的16位立体声WAV文件,有符号的小端。你的公式正在走上正轨,但试试这个:

x = (x/32768) - 1