audio - 移动和Web的实时音频(广播)流传输的最佳协议(protocol)是什么?

标签 audio streaming protocols shoutcast internet-radio

我正在尝试为互联网广播电台构建一个网站和移动应用程序(iOS,Android)。
网站用户广播他们的音乐或广播,而移动用户将仅收听广播电台并与其他收听者聊天。

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

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

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

我应该选择哪种协议(protocol)?
我需要提供各种协议(protocol)来覆盖所有平台吗?

最佳答案

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

流协议(protocol)

HLS的优点是允许用户以最适合其连接的比特率获得流。客户端可以无缝地放大/缩小,而无需停止播放。这对于视频尤其重要,但对于音频,即使是移动客户端,也能够在大多数区域播放128kbit流。如果您打算提供各种比特率并想要更改流媒体的质量,那么HLS是适合您的好协议(protocol)。

HLS的缺点是兼容性。 iOS支持它,仅此而已。 Android支持HLS,但仍然存在问题。 (也许再过一两年,一旦所有的Android 3.0都消失了,这将不再是一个大问题。)JWPlayer拥有一些使台式机用户在Flash中使用HLS的技巧。

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

我几乎总是选择使用HTTP进行纯渐进式流传输。一切都可以玩。 (甚至是12年前我的Palm Pilot的默认媒体播放器。)它很容易实现且易于理解。

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

潜伏

您提到2秒的延迟是可取的。如果SHOUTcast的延迟时间为2秒,则说明出现了问题。您不想希望延迟这么低,尤其是当您正在流式传输到移动客户端时。我通常至少从20秒的缓冲区开始,然后尽快将缓冲区刷新到客户端。这样就可以立即开始流播放(因为它填满了客户端缓冲区,因此可以开始解码),同时提供了一些针对由于网络状况而导致的缓冲区不足的保护。移动用户在建筑物的拐角处走动并失去良好的信号质量并不少见。您希望流尽可能地幸免于难,因此,如果您已经发送了数据以弥补丢失,则用户不必知道或担心他们的连接在短时间内变得平庸。

如果您确实需要低延迟,那么您就在寻找完全错误的技术。对于低延迟,请查看WebRTC。

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

编解码器

编解码器的选择决定了您的兼容性比什么都重要。 MP3最容易兼容,而AAC紧随其后。如果使用AAC,则在给定的比特率下可以获得更好的音频质量。大多数人使用它来减少带宽费用。

MP3需要支付许可费,而AAC可能需要支付许可费,具体取决于您使用的编解码器。请咨询律师。我不是一个人,并且许可非常复杂

其他编解码器包括Vorbis和Opus。如果可以使用Opus,则可以这样做,因为许可是完全开放的,并且可以获得良好的带宽质量。客户端兼容性虽然是Opus的杀手er。 (也许几年后会更好。)Vorbis是一个中等性能的编解码器,但是它是免费且清晰的。

在极端情况下,我有一些电视台在FLAC中进行流式传输。这是无损的音频质量,但是您要为中等质量的MP3电台支付8倍的带宽。基于HTTP流的FLAC兼容性目前尚无代码,但在VLC中可以正常使用。

为您的流支持多个编解码器是很常见的。根据您的预算,如果无法执行此操作,则最好使用MP3。

最后,在编码方面,如果可以帮助,请不要从有损编解码器转到其他有损编解码器。尝试使输出流尽可能接近输入。如果重新编码音频,则每次都会失去质量。

从浏览器记录

您提到了从浏览器流式传输的用户。几年前,我使用Web Audio API构建了类似的东西,其中捕获了音频,然后将其编码并发送到Icecast/SHOUTcast服务器。在这里查看:http://demo.audiopump.co:3000/在这里对其工作方式进行简要说明:https://stackoverflow.com/a/20850467/362536

无论如何,我希望这可以帮助您入门。

关于audio - 移动和Web的实时音频(广播)流传输的最佳协议(protocol)是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30184520/

相关文章:

python - 使用 sounddevice 模块从命令行播放声音样本时延迟太高

android - Android MediaPlayer的问题

FFMPEG:无限循环播放多个视频

ios - Swift 委托(delegate)永远不会被调用

C++ 是否使用 OpenAL 进行实时 PCM fft 音频处理?

blackberry - 如何在j2me/blackberry(midp)应用程序中快进和快退音频?

javascript - 如何处理流式 HTTP GET 数据?

php - 使用 PHP 和 Guzzle 流式传输远程文件

c# - EtherNet/IP(工业协议(protocol)).NET 库

ios - 协议(protocol)中的委托(delegate)函数未被调用