如何设置实时音频流式http服务器?

时间:2015-05-28 03:10:57

标签: http html5-audio audio-streaming audio-recording

我希望构建一个将音频(mp3,ogg等)从麦克风传输到Web浏览器的应用程序。

我想我可以使用html5音频标签从我的服务器读取/播放流。

我真正坚持的领域是如何设置流式http端点。我需要哪些技术,以及如何构建我的服务器以从麦克风获取实时音频并从我的服务器访问?

例如,对于流媒体播放mp3,我是否会在录制时不断回复mp3帧?

感谢您的帮助!

1 个答案:

答案 0 :(得分:2)

首先,让我们将这个问题分成几个部分。您有音频捕获(录制),编码/编解码器,服务器和接收客户端。

Capture -> Codec -> Server -> Several Clients

对于音频捕获,您需要使用Web Audio API along with getUserMedia。这将允许您从录制设备获取32位浮点PCM样本。这个数据流占用了大量的带宽......几兆比特用于立体声流。此流不能直接在HTML5音频标签中播放,虽然您可以使用Web Audio API在接收端播放,但它会占用太多带宽。您需要使用编解码器来降低带宽使用率。

您想要查看的编解码器包括MP3,AAC(及其变体,如HE-AAC)和Opus。并非所有浏览器都支持所有编解码器MP3是最广泛兼容的,但AAC为给定的比特率提供更好的质量。 Opus是一个免费且开放的编解码器,但仍然没有最大的客户端采用。在任何情况下,还没有一个编解码器可以在浏览器中以任何真正的稳定性运行。 (虽然它正在进行中!有许多使用Emscripten进行的测试项目。)我通过将样本的位深度减少到16位有符号整数并将此PCM流发送到服务器来解决了这个问题。通过二进制websocket做编解码器。

此编码服务器获取PCM流并通过编解码器服务器端运行它。在这里,您可以使用您喜欢的任何内容,例如许可的编解码器二进制文件或封装多个编解码器的FFmpeg等工具。

接下来,该服务器将数据流式传输到像Icecast这样的真实流媒体服务器。 SHOUTcast和Icecast服务器采用编码流,并通过类似HTTP的连接将其转发给许多客户端。 (Icecast是HTTP兼容的,而SHOUTcast很接近但不完全存在,这会导致兼容性问题。)

设置完流媒体服务器后,就像在<audio>标记中引用流网址一样简单。

希望这能让你开始。根据您的需要,您可能还会考虑WebRTC,它会为您完成所有这些工作,但不会为您提供质量选项,也不会扩展到少数用户之外。