毫无疑问直播是当前移动互联网最热门的领域之一,在超强热度的引导下直播领域也吸引了大量的商业资本。在各大直播应用万花齐放的时刻,也正是直播应用面临的真正风口。站在这个风口上,直播应用只把握好风向标,推出具备高用户粘性的差异化功能,才能在这个不断推陈出新的时代站稳脚跟,获得不可动摇的地位。
《连麦互动直播方案全实践》系列文章基于网易云信的摸索和实践,从场景、流程到方案、架构,对直播体验深度优化方案——“连麦互动直播”进行了全面的讲解和介绍。
相关阅读推荐:
连麦互动直播方案全实践1:什么是连麦互动直播?
连麦互动直播方案全实践2:网易云信连麦互动直播方案的演变过程
接下来我们来看看网易云信全新的连麦互动直播方案具体是怎么实现的?我们从架构图中可以看出,整个连麦互动直播主要由两大模块组成,实时音视频系统和互动直播服务器系统。
实时音视频系统
首先我们来看一下实时音视频系统。实时音视频其实就是基于网络的,能够进行音频或者视频,低延迟的双人或者多人之间的实时通话。像skype,facetime,微信,易信都提供了实时音视频通话功能。在互动直播中,实时音视系统主要是为了实现低延迟连麦功能。
我们来看下实时音视频的架构图:
各平台客户端使用客户端sdk接入实时音视频系统,包括:iOS,Android,PC和嵌入式设备。
客户端与业务服务器集群维持一条APP协议长连接,使用加密的tcp私有协议作为交互协议,主要用于相关业务的发起、通知推送等等。业务服务器集群包括用户加速接入的边缘连接服务器,包括用于为用户智能分配全球媒体服务器节点的分配服务器。客户端通过APP协议从分配服务器获得媒体服务器地址以后,就进入实时音视频的媒体和网络流程。
为了更直观的说明,架构图里展示的是单向流程。左侧是发送方,右侧是接收方。发送方的编解码进行音视频采集、音视频预处理,然后进行音视频的编码,随后进入网络层,在做完私有协议的封包、传输可靠性的保障以后,使用加密的udp私有协议作为传输层协议,将数据包发送到分配服务器根据智能算法分配的媒体服务器集群。通过边缘加速节点到达核心媒体中转服务器,媒体中转服务器负责将数据包转发给同一会话的其他用户。
接着我们来看接收方。接收方同样使用加密udp私有协议,接收方的网络层收到媒体中转服务器发过来的数据包,自底向上首先进行私有协议解包,然后做相关的网络层QoS保障。网络层处理结束以后将完整的音视频编码数据回调编解码层。在编解码层中,首先进行音视频的解码,然后相关音视频后处理,最后将处理完的音频进行播放,并在界面中绘制出视频画面。
这样就完成了一次音视频数据的单向交互,反向的流程一致。另外我们看媒体服务器集群中除了最关键的是中转服务器。还有录制存储服务器用户将通话过程中的音频和视频录制下来,并存储到云端。而统计分析服务器用于分析统计用户的通话质量与系统的运行状态,为优化实时音视频的通话效果很有帮助,同时对于节点分配服务器的策略也有相应参考。
实现的这套实时音视频系统的几大技术要点,主要包括下面四个部分:网络、音频、视频和适配。
有了上面实时音视频部分的介绍,我们就为连麦互动直播的低延迟连麦打下坚实的基础了。
互动直播服务器
互动直播服务器的功能主要是:
- 进行互动直播中主播与连麦者的画面合成;
- 对接CDN流媒体服务器
互动直播服务器的要点主要是:融合实时系统与直播系统;实时处理视频的合成;保证互动同步性以及高性能硬件。
下面我们来简单看一下互动直播服务器的多线程异步架构。
互动直播服务器主要由一个IO主线程、多个工作子线程和多个推流线程池组成。
IO主线程负责创建udp监听fd,并注册可读事件到eventloop事件循环中。中转服务器将音视频数据转发到主线程监听的端口上,eventloop可读事件回调,IO主线程负责读取内核UDP缓存中的将数据包,并根据哈希算法放入到与工作子线程一一对应的临时队列中。当内核缓存被读空以后,IO主线程会触发eventloop监听在eventfd可读事件的各个工作子线程。然后通过闭包的方式将各个主线程临时队列里的数据派发到相应的工作子线程中处理。
工作子线程从队列中依次取出数据包,对数据进行协议解包,进入协议分发器,进行业业务逻辑的拆分,对于音频数据进行丢包处理,然后会由jitterbuffer算法来平滑抖动并解码成pcm数据;对于视频会同样会进行丢包处理,然后进行视频解码成yuv数据,视频部分还会做一步和音频的同步操作。之后会进行每个房间的多路音频pcm数据的混音和多路视频yuv的混合。混音结束以后会将pcm数据再编码为aac然后调用aac推流,视频yuv数据编码为H264以后调用H264的推流。
推流线程池负责讲aac和h264的裸数据按照FLV的格式进行封装,然后使用推流网络IO将音视频包使用使用RTMP协议推送到cdn流媒体服务器。
普通观众可以使用rtmp拉流地址向cdn流媒体服务器拉取音视频流完成连麦互动直播的收看。
我们看到我们只有一个IO线程来处理IO读操作,这样做的目的主要是保证我们的IO不受音视频编解码的影响,我们会把IO线程绑定在特定的cpu上。
工作子线程也会绑定对应的cpu核心,这么做也是为了提高性能。绑定以后,性能大概可以提高20%。主要是因为工作子线程是超高计算密集型的,对cpu的压力很大,如果不绑定,线程就有可能在不同的核心上切换,导致相应的性能损失。
服务器部署和智能分配
讲完了上面两大系统各自的功能和实现细节以后,我们还缺少什么呢?
我们的服务是要部署在我们服务器上,而服务器的部署和分配在连麦互动直播里至关重要,那我们接下来就来看服务器部署和智能分配方面有哪些要点。
首先为了能够为全球的用户提供优质服务,全球范围的节点部署是必不可少的。以网易云信的经验,依赖网易在全球的机房,我们在国内部署多个BGP机房和三线机房,对于海外我们部署了海外节点,特别为了优化跨国聊天,我们还使用跨国代理的光纤专线。
第二,在有了这么多节点以后,就需要由一个节点的智能分配策略。需要根据用户的地理位置、用户的运营商ISP类型为用户分配最佳接入的节点。当然分配的时候还需要考虑服务节点的实时负载情况和实时的网络状况。
第三,单纯的服务端的节点分配是不够的,客户端还需要配合使用智能选路策略。根据各链路的丢包和时延,智能选择最佳链路。同时当某条链路中断后,还会切换到另一条链路上。链路的切换是透明的,对上层用户无感知,也就是通话不会受到影响。
第四,为了保证整个实时音视频服务的高可用,我们的所有服务器均使用高可用的架构部署,由于音视频服务器对网卡是高需求,我们80%的服务器使用了配备万兆网卡的高性能物理机。同时对于服务器宕机、网络切断,都使用了相应的恢复和策略切换,所有这些都为了我们实时音视频服务的高可用。
以上就是网易云信全新连麦互动直播方案的具体实现方法,欢迎大家留言,与我们互动交流。