1

我们无法在浏览器中播放流式音频(使用 Chrome)。

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

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

所以问题是——我们做错了什么?是否有我们应该使用的编解码器/格式?当然,所有代码(avconv、NodeJs 和客户端)都可以随意修改。如果需要,我们也可以使用其他浏览器,尽管我认为这不是问题所在。我们唯一知道的是,我们确实需要它来通过 websockets 工作。

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

有任何想法吗?所有帮助将不胜感激。

谢谢!托马斯

4

1 回答 1

0

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

  • 通道数
  • 每个样本的位数
  • 已签名/未签名
  • 字节序

假设您有一个典型的 16 位立体声、有符号、小端序的 WAV 文件。你的公式是正确的,但试试这个:

x = (x/32768) - 1
于 2013-11-27T18:47:50.933 回答