直播业务
直播的业务一般包括:推流,拉流/播放,回源,录制,时移,转码。
推流
直播推流是指通过推流协议,把音视频数据推送到CDN的服务器。
推流协议主要是RTMP,也可以使用WebRTC。
推流端需要把音视频数据封装成FLV格式或者RTP格式的数据。
推流端需要选择最近的一个节点推送数据。
拉流/播放
拉流:服务器之间读取实时流数据进行回源。
播放:客户端读取实时流数据进行播放。
拉流/播放可以使用服务器支持的不同的协议,服务器根据使用的协议返回相应的数据。
拉流/播放端需要选择最优的节点读取实时流数据。
回源
客户端向一个服务器请求某个流时,服务器有这个流就马上返回数据;服务器没有这个流,就需要去中心服务器请求这个流的数据,这就是回源。
回源可能是多级的,也可以是多协议支持的。
录制
在直播过程中,可以把直播产生的音视频数据保存下来,这个过程就是录制。
录制完成后,可以回放直播过程。
录制文件格式有hls,flv,以及mp4。
时移
在直播过程中,可能需要查看前面一段时间的数据,或者从前面几秒开始查看直播,这个就是时移做的功能。
时移是通过录制产生的切片信息实现的,所以时移使用是的HLS协议。
时移一般有两种播放方式:
- 播放过去的一段时间
- 从过去的哪个时间点一直往后播放,直到结束
转码
在拉流/播放过程中,服务器遇到不支持的编码请求或者不同的分辨率,或者其他情况,就会触发转码。
转码就是通过程序,把不符合要求的流,转码成符合要求的流。
转码一般使用ffmpeg进行,同时也可以使用显卡进行硬件加速。
CDN分发
主播推流,一般只推送到一个服务器,而播放却是在全国各地,这就需要CDN把流传输到各地的服务器,这就是CDN分发。
CDN分发一般是被动的,有访问需求才进行回源;也可以主动下发进行预热。
CDN加速
客户端的网络环境差异很大,为了优化播放端的体验,CDN需要把播放引导到离客户最近的,网速最快的服务器,相当于CDN给客户端提升了速度,这就是CDN加速。
CDN加速主要是通过减少访问服务器的距离,提供大带宽的服务,选择相同的运营商,选择延时低的流媒体协议等手段来实现内容的加速。
开播到看播的流程
一个主播启动直播,到用户进行播放,这中间发生过什么事?为什么需要直播分发和直播加速?
推流端
主播通过直播APP主动发起直播请求,直播APP启动音视频采集,然后采集的数据编码成H264/AAC,接下来封装成推流协议的数据格式,把数据推送到边缘服务器。
采集
一般通过手机摄像头或者采集卡采集到视频数据,原始数据是一幅幅的图片,通过硬件编码,编码成H264/H265格式的视频数据。
音频是通过麦克风采集,通过硬件编码,编码成AAC格式的音频数据。
推流协议封装
直播APP根据使用的推流协议,把编码后的视频数据和音频数据封装成推流协议需要的格式
推流
直播APP通过推流域名获取到最优的推流服务器,使用推流协议连接上推流服务器,把封装好的数据推送到服务器。
一般云厂商会做DNS负载调度,根据访问DNS服务器的IP,选择相同运营商,距离最近,负载最轻的服务器。
选择合适的推流协议,选择合适的推流服务器,都是为了解决第一公里
的问题。
推流服务器
解封装
推流服务器根据推流协议,跟直播APP建立连接,接收推送过来的数据,并且解开封装,得到音频和视频数据,以及Meta信息。
通知索引服务器
推流服务器接收到一路推流后,会通知索引服务器,并带上流的各种信息。
索引服务器收到通知后,会记录这种流,以便其他服务器过来查寻时,能够返回正确的推流服务器地址。
索引服务器也可以通知业务服务器,新增加了一路直播流,直播APP就可以刷新看到这路新的流。
播放端
播放
直播APP刷新后,出现了新推上来的直播流,点击播放,直播APP通过直播流的域名,获取到最优的播放服务器。
直播APP根据获取到的播放服务器地址,使用播放协议(HLS/RTMP/HTTP-FLV)建立连接,接收数据。
播放器接收到数据后,进行解封装,解编码格式,渲染输出画面,用户就能看到界面
最后一公里
最后一公里
是指播放服务器到用户端的过程。
直播APP根据播放域名,从DNS服务器获取最优的播放服务器地址(也有可能是通过访问负载均衡服务器)进行播放;而DNS服务器(或者负载均衡服务器)需要从运营商,IP距离,负载情况等多方面考虑,选择最优的一个服务器。
同时,直播APP要根据业务需求,用户网络环境等选择合适的播放协议进行播放。
最后一公里
需要直播系统和直播APP,业务设计等多方面共同参与优化,给用户最好的体验。
CDN
回源
当直播APP向边缘节点(DNS返回的播放服务器)请求这个直播流时,边缘节点会先检测本地有没有这个流;如果没有找到,则需要向回源服务器请求数据。
边缘节点接收到回源数据后,马上会返回给直播APP,这样用户就可以及时看到画面。
中转
边缘节点的运营商,可能跟推流服务器的运营商不一样,这时候就需要中转服务器来处理。
首先,中转服务器都是多线服务器,即中转服务器有多个网卡,每个网卡接一个运营商。
其次,边缘节点向中转服务器请求,是从边缘节点相同的运营商的线路发起请求。
最后,中转服务器推流服务器拉流时,是从推流服务器相同的运营商线路发起拉流请求。
所以,通过中转服务器处理后,边缘节点和推流服务器的运营商差异就被屏蔽了,用户是无感知的。
总结
一个直播,从终端到CDN,再从CDN到终端,每个环节都涉及很多技术,都是必不可少的。
直播系统在这个过程中,提供了推流功能,CDN分发,CDN加速功能,以及播放功能。
如果主播还需要录视频,CDN还需要启动录制功能。
直播平台需要对内容进行审查,则需要时移及其他定制的功能。
用户播放这个主播的流,手机屏幕不一样,手机芯片不一样,可能需要不一样的分辨率,不一样的编码格式,这时候直播CDN就需要为这个流提供转码的能力。