2015-05-28 52 views
1

我曾希望建立一个应用程序,将音频(mp3,ogg等)从我的麦克风传输到网络浏览器。如何设置实时音频流http服务器?

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

我真的坚持的地方是如何设置流HTTP端点。我需要哪些技术,以及我的服务器应该如何构造以从我的麦克风获取实时音频并从我的服务器访问?

例如,对于流式传输mp3,我是否经常用录制的MP3帧进行响应?

感谢您的帮助!

回答

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>标记中引用流URL一样简单。

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