什么是移动和网络的现场音频(无线电)流媒体的最佳协议?

时间:2015-05-12 07:33:18

标签: audio streaming protocols shoutcast internet-radio

我正在尝试为互联网广播电台建立一个网站和移动应用(iOS,Android)。 网站用户播放他们的音乐或广播,移动用户只需收听广播电台并与其他听众聊天。

我搜索了一周,并在Amazon EC2上使用Wowza引擎(使用HLS和RTMP)和SHOUTcast服务器制作原型。

使用HLS有5秒的延迟,但RTMP和SHOUTcast有2秒的延迟。 有了这个结果,我想我应该选择RTMP或SHOUTcast。

但我不确定RTMP和SHOUTcast是最好的协议。 :(

我应该选择哪种协议? 我是否需要提供涵盖所有平台的各种协议?

3 个答案:

答案 0 :(得分:24)

这是一个非常广泛的问题。让我们从分发协议开始。

流媒体协议

HLS的优势在于允许用户以最适合其连接的比特率获取流。客户端可以无缝扩展/缩小而无需停止播放。这对于视频尤其重要,但对于音频,即使移动客户端也能够在大多数区域播放128kbit流。如果您打算提供各种比特率并希望在中途改变质量,那么HLS对您来说是一个很好的协议。

HLS的缺点是兼容性。 iOS支持它,但这就是它。 Android有HLS支持,但它仍然有问题。 (也许在所有Android 3.0人员离开后的一两年内,这不会是一个问题。)JWPlayer有一些技巧可以使HLS在桌面用户的Flash中工作。

除非您只关心Flash用户,否则我不会打扰RTMP。

使用HTTP进行纯粹的渐进式流式传输是我几乎总是选择的路线。 Everything 可以播放它。 (甚至是我在12年前使用Palm Pilot的默认媒体播放器。)它实现起来很简单并且很容易理解。

SHOUTcast实际上是HTTP,但实现性差的版本存在兼容性问题,尤其是在移动设备上。它的响应中有一个非标准的状态行,打破了很多客户端。 Icecast是一个很好的选择,我今天推荐用于生产。作为另一种选择,我创建了自己的名为AudioPump的流媒体服务,它也是HTTP,并且专门用于修复与古怪的移动客户端的兼容性,例如旧硬件上的原生Android播放器。目前尚无法提供,但如果您想尝试,可以通过brad@audiopump.co与我联系。

延迟

你提到了2秒的延迟是可取的。如果你使用SHOUTcast获得2秒的延迟,那就错了。您希望延迟低,特别是如果您要流式传输到移动客户端。我通常以一个至少20秒的缓冲区开始,它以尽可能快的速度刷新到客户端。这使得能够立即启动流回放(因为它填满了客户端缓冲区以便它可以开始解码),同时提供一些针对由于网络条件引起的缓冲区欠载的保护。移动用户走在建筑物的角落并且失去了良好的信号质量并不罕见。您希望您的流能够尽可能地生存,因此如果您已经发送了数据以支付退出,则用户无需知道或关心他们的连接在短时间内变得平庸。

如果您确实需要低延迟,那么您将完全看错了技术。如需低延迟,请查看WebRTC。

您当然可以调整传统的互联网广播设置以减少延迟,但很少这是一个好主意。

编解码器

编解码器的选择决定了你的兼容性,而不是其他任何东西。 MP3很容易兼容,AAC也不甘落后。如果你选择AAC,你可以获得比特率更高质量的音频。大多数人使用它来减少带宽费用。

MP3有许可费,AAC可能会根据您对编解码器的使用情况而定。请咨询律师。我不是一个,许可证非常复杂。

其他编解码器包括Vorbis和Opus。如果您可以使用Opus,请执行此操作,因为许可是敞开的,您可以获得良好的带宽质量。这里的客户兼容性是Opus的杀手。 (也许在几年后会更好。)Vorbis是一个平庸的编解码器,但是自由而清晰。

在极端情况下,我有一些电台在FLAC中进行流式传输。这是无损的音频质量,但你需要支付8倍的带宽,就像使用中等质量的MP3电台一样。 FLAC over HTTP流兼容性目前不是代码,但它在VLC中可以正常工作。

支持流的多个编解码器是很常见的。根据您的预算,如果您不能这样做,那么最好使用MP3。

最后在编码时,如果可以帮助它,请不要从有损编解码器转到另一个有损编解码器。尝试使输出流尽可能靠近输入。如果重新编码音频,每次都会丢失质量。

从浏览器录制

您提到用户从浏览器流式传输。几年前,我用Web Audio API构建了类似的东西,音频被捕获然后被编码并发送到Icecast / SHOUTcast服务器。请在此处查看:http://demo.audiopump.co:3000/有关其工作原理的简要说明,请访问:https://stackoverflow.com/a/20850467/362536

无论如何,我希望这可以帮助你开始。

答案 1 :(得分:0)

流式直接audio/mpeg(mp3数据包)在我尝试的任何地方都有用。

答案 2 :(得分:-1)

如果您正在开发APP,那么请使用AAC,如果您只是通过网络浏览器播放,那么您需要一个HTML5 Implimentation就是MP3。所有自定义协议(如RTMP或SHOUTcast)都需要构建其他UI。在开源世界中有一些第三方玩家可用。您可以使用它们或坚持使用HTML5 MP3 / OGG,因为现在大多数人都在使用Chrome浏览器或其他HTML5投诉浏览器。