音视频互动开发中的直播推流的协议

音视频互动开发中的直播推流协议

前两天有个做直播创业的朋友问我,他们团队在搭建直播系统的时候,市面上那么多推流协议,到底应该怎么选?这问题问得好,其实不只是他,很多刚接触音视频开发的同学都会被这个问题困扰。今天咱们就坐下来聊聊这个话题,把直播推流协议这回事儿给讲透彻了。

在说具体协议之前,咱们先搞清楚一个基本概念:什么是推流?简单来说,推流就是把直播现场的视频和音频数据,从主播端通过网络传输到服务器端的过程。这个过程听起来简单,但实际上涉及到的技术细节可不少。而推流协议,就是规定这个数据传输怎么组织、怎么打包、怎么传输的"交通规则"。

你可能会想,不就是传个视频吗?搞这么复杂干嘛?这话要是让搞音视频开发的人听到,恐怕要笑出声来。直播和普通的视频传输可不一样,它对实时性的要求极高。你想啊,观众看直播的时候,肯定是希望看到的是当下正在发生的事情,如果延迟个几十秒甚至几分钟,那还能叫直播吗?所以推流协议的设计目标,说白了就是在保证画质的前提下,尽可能快地、尽可能稳地把数据送到服务器。

主流推流协议大盘点

目前业内常用的推流协议主要有RTMP、HLS、HTTP-FLV和webrtc这几种。它们各有各的特点,也各有各的适用场景。咱们一个一个来说道说道。

RTMP协议:老牌劲旅,根基深厚

RTMP这个协议可以说是直播领域的"老前辈"了,全称是Real Time Messaging Protocol,从名字就能看出来,这是专门为实时消息传输设计的。它最早是Adobe公司开发的,后来虽然Flash被淘汰了,但RTMP协议本身因为其成熟稳定的特性,在直播领域依然占据着重要地位。

RTMP协议的工作原理是这样的:它基于TCP协议,采用长连接的方式进行数据传输。主播端把视频数据切分成一个个小块,然后通过RTMP协议把这些小块发送到服务器。因为是长连接,所以不需要每次传输都重新建立连接,这在一定程度上减少了传输开销。

RTMP的优点很明显,它的技术成熟度高,生态完善,很多CDN服务商都原生支持RTMP。而且它的延迟表现也不错,正常情况下可以做到2到3秒的延迟,这个成绩对于大多数直播场景来说已经够用了。不过RTMP也不是没有缺点,它有一个比较麻烦的问题:它是基于TCP的,而TCP在网络状况不好的时候会有重传机制,这可能导致延迟进一步增加。另外,RTMP协议本身是Adobe私有的,虽然后来Adobe公开了协议规范,但多多少少还是给开发者带来一些困扰。

HTTP-FLV协议:轻量灵活,新生力量

HTTP-FLV这个协议,你可以理解为是RTMP的"HTTP版本"。它把RTMP的数据流封装在HTTP请求响应里面,这样就可以利用HTTP的很多特性,比如可以通过CDN分发,可以通过80端口走HTTP代理,穿透性比纯RTMP好很多。

HTTP-FLV的延迟表现和RTMP差不多,也是2到3秒的水平。但它在某些方面比RTMP更灵活,比如它可以直接在浏览器里面播放,不需要额外的插件(当然这需要浏览器支持FLV格式)。另外,因为使用的是HTTP协议,所以它可以很好地利用现有的HTTP基础设施,这对于大规模分发来说是个好消息。

不过HTTP-FLV也有它的局限性。首先,它本质上还是基于TCP的,所以网络波动时的表现和RTMP差不多。其次,它的生态没有RTMP那么成熟,虽然近年来发展很快,但各种播放器的兼容性还是要稍差一些。还有一点,HTTP-FLV通常需要拉流端保持长连接,这在某些场景下会增加服务器的压力。

HLS协议:苹果力推,自有妙用

HLS这个协议来头不小,它是苹果公司推出的,全称是HTTP Live Streaming。从名字就能看出来,这是一个基于HTTP的直播协议。苹果为什么要推这个协议呢?主要是为了解决iOS和macOS平台上的直播播放问题。

HLS的工作原理和其他协议不太一样。它不是连续地推送数据流,而是把直播流切分成一系列小文件(通常是.ts格式),然后生成一个索引文件(.m3u8)来管理这些小文件。播放器先下载索引文件,然后按照索引去下载对应的小文件进行播放。这种设计让HLS有了很多独特的优势。

HLS最大的优点就是自适应码率。它可以根据当前的网络状况动态调整视频质量,网络好的时候看高清,网络差的时候看流畅,用户体验很好。另外,因为它完全基于HTTP,所以兼容性极好,几乎所有平台、所有浏览器都能播放。而且这种分段传输的方式也让CDN分发变得非常简单。

但HLS的缺点也很突出,就是延迟太大。由于它需要等待一定时长的切片才能生成文件,再加上播放器需要缓存一定量的数据才能开始播放,所以HLS的延迟通常在10秒到30秒之间,有些情况下甚至更长。这样的延迟对于互动直播来说确实是个问题,但如果是那种对实时性要求不高、追求稳定播放的场景,HLS还是很合适的。

webrtc协议:实时王者,后来居上

如果说前面几个协议都是为直播场景设计的,那么WebRTC(Web Real-Time Communication)从一开始就是为实时互动而生的。它最初是Google收购的一项技术,后来成为了W3C标准,是浏览器之间进行实时音视频通信的技术基础。

WebRTC的技术架构和其他协议有本质的区别。它采用UDP作为传输层协议,而不是TCP。UDP的特点是速度快,但不保证数据一定到达。这个设计选择让WebRTC获得了极低的延迟,理想情况下可以做到几百毫秒的端到端延迟,这在所有协议里面是最低的。

除了低延迟,WebRTC还有很多强大的特性。比如它内置了回声消除、噪声抑制、自动增益控制等音频处理功能,这些对于保证通话质量非常重要。另外,WebRTC还支持点对点(P2P)传输,在某些场景下可以减轻服务器的压力。再有,它原生支持多方通话,这对于需要多人互动的直播场景来说非常方便。

当然,WebRTC也不是完美的。它最初是为浏览器设计的,虽然现在已经可以在原生应用中使用了,但开发门槛相对较高。另外,由于使用UDP协议,在网络环境复杂的时候可能会出现丢包,影响画质。还有就是WebRTC的服务器架构和其他协议不太一样,需要专门的服务端支持。哦对了,WebRTC的连接建立过程也比较复杂,需要用到STUN和TURN服务器来穿透NAT。

如何选择合适的推流协议

说了这么多协议,可能有人要问了:到底应该怎么选?这确实是个实际问题。我的建议是:先想清楚你的场景需求,然后再做选择。

如果你是做秀场直播、电商直播这类场景,对延迟有一定要求,但也不是毫秒必争,那么RTMP或者HTTP-FLV是比较稳妥的选择。这两个协议成熟度高,生态完善,各种坑基本都被人踩过了,遇到问题也容易找到解决方案。

如果你是做互动性很强的直播,比如连麦PK、视频交友这类场景,那WebRTC几乎是必选项。为什么?因为这类场景下主播和观众之间有频繁的互动,延迟高了会严重影响体验。你能想象两个人连麦聊天,一个人说完话另一個人要等两三秒才能回应吗?那场面想想都尴尬。业内领先的实时音视频服务商在这方面已经做了很多优化,有些可以实现600毫秒以内的端到端延迟,这对互动场景来说就非常友好了。

如果你是做大型活动直播、赛事转播这类观众数量巨大的场景,那可能要综合考虑。比如推流端用RTMP保证稳定性,拉流端用HLS或者DASH来支持自适应码率和大规模分发。毕竟这种场景下稳定性比延迟更重要,几秒钟的延迟观众其实感知不强,但如果播放不流畅、画面卡顿,那用户早就跑了。

还有一个要考虑的因素就是平台兼容性。如果你的直播要在iOS上播放,那可能就得考虑HLS或者WebRTC,因为苹果平台对某些协议的支持不太友好。如果要在Web端播放,那WebRTC是最好的选择,因为它是浏览器原生支持的。

实际开发中的一些建议

聊完了协议选择,我再分享几个实际开发中的经验之谈。

首先是关于延迟和画质的平衡。很多开发者一上来就追求极低延迟,把码率、分辨率都拉满,结果网络一波动就卡得不行。我的经验是先保证流畅,再追求低延迟。毕竟直播最怕的就是卡顿,一卡观众就跑了。可以在码率自适应上下功夫,让系统根据网络状况自动调整,这样用户体验反而更好。

其次是多协议支持。很多成熟的直播系统都会同时支持多种推流和拉流协议。比如推流端支持RTMP和WebRTC,拉流端支持RTMP、FLV、HLS和WebRTC。这样可以根据不同的客户端、不同的网络环境选择最优的传输方式,兼容性更好。当然,这也意味着开发和维护成本会增加,需要权衡利弊。

还有一点就是要重视服务端的选择。推流协议再优秀,如果服务端不行,整个直播体验还是上不去。现在有很多云服务商提供一站式的直播解决方案,包括推流、转码、分发、播放全套服务。对于中小团队来说,使用这类服务可以省去很多繁琐的工作,把精力集中在业务逻辑上。

主流推流协议对比

协议 传输层 典型延迟 浏览器支持 自适应码率 适用场景
RTMP TCP 2-3秒 需插件 不支持 秀场直播、电商直播
HTTP-FLV TCP 2-3秒 部分支持 不支持 常规直播、拉流分发
HLS TCP 10-30秒 原生支持 支持 点播、大规模分发
WebRTC UDP <1秒 原生支持 支持 互动直播、连麦通话

另外我想说的是,技术选型很重要,但也不是一成不变的。随着业务的发展,需求可能会变化,协议选择也可能需要调整。比如一个直播平台刚开始做的时候可能用RTMP就够了,但后来要做连麦互动,可能就需要引入WebRTC。所以架构设计的时候要考虑扩展性,给未来的升级留有余地。

写在最后

直播推流协议这个话题要说起来可以很深,今天咱们聊的其实只是冰山一角。每一个协议背后都有大量的技术细节值得深入研究,比如RTMP的流控制、WebRTC的拥塞控制、HLS的切片策略等等。如果你想在音视频开发这个领域深耕,这些都是值得花时间研究的方向。

技术这东西,没有最好的,只有最合适的。选择推流协议也是一样,关键是要理解每个协议的特点,然后根据自己的实际需求做出选择。如果你刚开始做直播开发,我的建议是先从RTMP或者HTTP-FLV入手,把基础打牢,然后再根据业务需要逐步尝试其他协议。

好了,今天就聊到这里。希望这篇文章能给你一些启发。如果觉得有帮助,欢迎收藏转发,咱们下次再聊别的技术话题。

上一篇声网 sdk 的开发者社区问题解决效率评估
下一篇 webrtc 的音视频质量评估指标及工具

为您推荐

联系我们

联系我们

在线咨询: QQ交谈

邮箱:

工作时间:周一至周五,9:00-17:30,节假日休息
关注微信
微信扫一扫关注我们

微信扫一扫关注我们

手机访问
手机扫一扫打开网站

手机扫一扫打开网站

返回顶部