直播的过程包括:采集、处理、编码、封包、推流、传输、转码、分发、拉流、解码、播放。每一个环境都会有很多的坑,都需要时间去试错。因此,要做好音视频,除了靠技术的积累还需要靠多年的经验。
采集和播放:音视频数据是从直播的发起端,进行语音和视频的采集;在直播的接收端进行语音和视频的播放。而采集和播放两个环节会涉及到具体的硬件的音视频设备性能。需要注意的是,采集和播放都会用到具体硬件平台的接口,这和具体硬件设备的接口、设计和性能等密不可分。因此在系统设计阶段,就要考虑硬件设备的兼容性和跨平台。
编码和解码:编解码环境会涉及到具体硬件芯片的处理能力。我们可以将其分为两类:一类是采用硬编硬解;另一类是采用软编软解,二者各有各的优缺点。
硬编硬解要用到GPU的处理能力,优点是效率高,速度快,分担CPU的压力,减少CPU发热;缺点是不同的硬件平台(主要是android)芯片性能和接口参数不一样,处理的效果也不一样,要进行适配。
软编软解不使用GPU,使用CPU的计算能力,优点是对各个硬件平台的兼容性好;缺点是计算的压力都放在CPU上,速度慢,效率低,而且CPU会容易发热。需要注意的是,有些设备CPU和摄像头离得近,CPU发热可能会导致摄像头采集的时候工作不正常,出现丢帧的情况。
推流:是发起音视频通讯的智能终端设备把音视频流推送到音视频服务器集群(包括音视频流媒体服务器,信令调度服务器和混流服务器等)。推流是能否做到低延迟的关键。智能终端所在的环境十分的复杂,要适应这些复杂的环境,要做很多的工作。在国内,一般情况下网络的上下行是不对等的,上行网络远远小于下行网络,而且用户的设备质量参差不齐,所在区域的接入点服务质量良莠不齐。推流可以分为两步:第一步,选路:选择一条最优的路径;第二步,推流,在该路径上做到最优。在服务器集群上的处理包括混流和存储等,然后把音视频流转推到CDN网络。
拉流:是需要观看的用户去拉去音视频流到终端设备观看。拉流的用户分为两类,一类是普遍的观众;一类是参与到多人互动对讲中的用户(连麦用户)。相对来说,普通观众对低延迟要求不高,只要求流畅和高质量,所以可以使用CDN网络来均衡质量和成本。观众端从就近的CDN网络节点进行拉流,在智能终端进行解码和播放。使用的协议是RTMP\HLS\HTTP-FLV协议。多种协议可以适配不同的环境。有些智能硬件场景是没有普通观众的,那么就只有参与音视频互动对讲的用户了。对于进行互动对讲的核心参与者,音视频流是不经过CDN网络的。各个参与者直接从音视频流媒体服务器上拉流来播放。音视频流媒体服务器的质量相对较好,网络资源也较好,能够提供低延迟,高质量的音视频服务。
高音质和高画质如何保障:
1、音频数据量较小,对带宽要求低,一般不会限制音频,要优先保证音频数据可以发送,毕竟在极端网络环境下,即使视频不好,只要音频流畅、清晰,互动沟通还是可以继续的。
2、为了获得低延迟同时保证视频的质量,要平衡流畅度和清晰度。目前通常采用VBR或CBR来处理。在保证画面质量不至于太差的情况下,可以选择性的丢帧。这样可以避免推流端因为TCP拥塞导致于推流质量越来越差,否则除了引起卡顿也会影响画面质量严重下降。在网络确实太差的情况下,通常为了保证视频流畅,可以适当的降低推流码率,这样画面质量会不可避免的下降,但是保障了画面的流畅。通常做法是设置一个极限值,避免视频质量太低无法观看。
如何解决带宽资源消耗问题:
1、码率自适应:让音视频流的码率自动适应复杂的网络环境,比如网络抖动。我们都知道,在国内用户端的上下行网络带宽是不对称的。比如说下行如果是100Mbps,那么对应的上行可能就是1Mbps,这样上行就成了瓶颈,下行反而问题不大。因此,要确保推流成功且质量好,那么就要利用好上行的网络带宽。推流端药能够做到根据各种维度的因素(个体历史数据、群体历史数据、网络探测数据等)分析和预测网络的情况,决定推流应该采用多大的码率,选择那条线路。关键点是要找到目前上行带宽的情况下恰好满足上行带宽的最大码率。
2、云端混流:把多路音视频流在服务器集群里面混合成一路流,然后转推到CDN去,让观众拉混好的单流来观看。这样可以节省一部分带宽成本。拉流端拉流的时候有两个选择,一个是把所有推流端的音视频流单独拉下来播放,一个是把云端混合好的一路单流拉下来播放。
采用不混流的方案,优点是拉流端可以灵活的操控多路流,比如画中画的灵活对调等,缺点是多占用了网络带宽。
采用混流的方案,优点是拉流端只需要拉一路流,可以大大的节省从流媒体服务器到CDN网络和CDN网络到拉流端所占的网络带宽,缺点是多路音视频流经过混流以后,画面布局就固定了,在拉流端不能再进行灵活操控了。