我们在浏览器中播放流式音频时遇到问题(使用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)
有什么想法吗?所有帮助将不胜感激。
谢谢! 托马斯
答案 0 :(得分:0)
从整数样本到浮点样本的转换不正确。你必须考虑到:
假设你有一个典型的16位立体声WAV文件,有符号的小端。你的公式正在走上正轨,但试试这个:
x = (x/32768) - 1