网易云信吴桐:连麦互动直播方案全实践
演讲 | 吴桐
人物名片:网易云信多媒体资深技术架构师。网易云信音视频实时通话项目与互动直播项目技术负责人,负责项目的架构和实现。加入网易后,先后参加了网易UU网游加速器、易信音视频实时通话等项目。
关键词:连麦互动直播
移动直播显然已经是2016年不能再热的话题,短短不到一年时间,市场上出现了几百家直播APP,内容涉及秀场、教育、电商、游戏、金融等,直播领域出现了白热化的竞争状态。
随便选择几款APP打开,我们会发现各APP从内容、功能和互动方式都非常雷同。观众使用的是:消息、点赞、送礼等这些是传统的方式与主播进行互动。各APP为了能够在如此激烈的竞争中存活并脱颖而出,需要推出更具差异化且能满足客户刚需的功能。
连麦互动直播是一个很好的新功能切入点,因为它可以让观众和主播进行面对面的实时互动,这将大大提升用户的参与感与幸福感。用户的幸福感提升带来了更高的用户粘性,随之增加的就是平台的收入了,这对直播平台的意义也就不用多说了。
因此,连麦互动直播是直播深度优化的必然形式。
同时随着下面几个条件的成熟,为连麦互动直播功能的推出打下更好的基础:
直播大规模普及,为连麦互动提供了用户基础,为用户培养了习惯;
移动网络带宽提高,保证了连麦互动的带宽需求;
手机天然就是一个摄像头,降低了用户连麦的成本,不再需要像pc一样买一个摄像头、麦克风坐在电脑前;
随着手机硬件性能提高,可以随时随地进行高清视频互动直播。
接下来我们来简单看看连麦互动直播的功能流程:
右侧这个手机是普通观众看到的直播画面。
① 主播正常开始直播,普通观众看到主播的单人直播画面;
② 需要连麦的观众发起连麦请求,进入连麦申请列表;
③ 主播从连麦申请列表中选择一名或多名观众进行连麦操作,主播与连麦观众进行实时音视频互动,同时互动直播系统生成“合成画面”;
④ 普通观众看到直播画面为包含主播与连麦观众的“合成画面”;
⑤ 连麦结束,恢复主播单人直播模式。
看完功能流程图,我们来看一下连麦互动直播的几个应用场景。同时也顺便在真实场景里看看连麦互动直播的流程是怎么样的。
首先是娱乐秀场的场景,这个场景大家很好理解:美女主播和台下粉丝互动,对用户幸福感的提升,效果绝对明显。我们来看左图是观众申请连麦以后,主播端连麦申请列表的状态。主播选择一名观众进行连麦互动,连麦者的出现在直播画面在右下角。
下个是在线教育连麦场景,口语老师在讲课的过程中可以让学生参与阅读发声,老师可以及时纠正发音,能够达到很好的教育效果,其它同学听到教学过程也会有一些自己的收获,这对在线教育来说是明显的进步。
电商互动场景,买家可以与卖家直接互动沟通。对于提升用户体验与参与感有明显作用。这样买卖双方的沟通成本大大降低,也提升直播平台的用户活跃度。
讲完了应用场景,我们来看一下网易云信在连麦互动直播方案的演变过程。我们从2015年年初就开始研究连麦互动直播技术,提出了一个在主播客户端合流的方案。2016年随之移动端直播的快速兴起,我们在15年的老方案的基础上,迭代推出了一个新方案,也就是服务端合流方案。
接下来,就进入了我今天分享的重点部分:为大家详细阐述这两个方案的具体实现方式,并且分析各自的优势、劣势以及适用的场景。
首先我们来看一下去年提出的老方案,我们称之为:主播端合流。
传统的直播流程是:主播客户端采集并编码音视频数据以后,直接使用RTMP协议推流到CDN,其它观众使用对应的拉流地址向CDN拉取音视频流。该方案我们不改变由主播来推流这个架构,只是在主播需要与观众连麦互动时使用实时音视频系统来进行主播和观众的实时互动连麦,通过实时通话通道主播端收到观众端发送的音频和视频数据,主播端将自己的声音和观众的声音做混音,并将自己的画面与观众的画面做视频合成,最后主播将混合的声音和画面推流到CDN流媒体服务器。通过这种方式就实现了观众与主播的连麦互动直播。
我们先来看一下这个方案的优缺点:
由于上述两个问题,该方案并不是移动端上连麦互动的最佳方案。
为了解决这两个问题,我们团队用3个月时间来做技术攻关,设计并开发了一个替代方案。
这个全新的连麦互动直播方案,作为优化替代方案,方案的关键是:主播不再直接推流到CDN流媒体服务器,而是基于实时音视频通话系统,由实时音视频的中转服务器转发给互动直播服务器,再由互动直播服务器处理后推流到CDN流媒体服务器,互动直播服务器是我们为方案二全新研发的一个服务器。
音视频实时通话系统,可以实现多人的实时互动,而且多人模式下所有的数据包都是通过音视频中转服务器中转。此时如果观众需要与主播连麦互动,只需要让观众加入到实时音视频的房间中,音视频中转服务器在转发给房间中其他客户端的同时,转发一份到互动直播服务器,互动直播服务器对收到的语音进行混音,同时对视频画面做混合处理,处理完毕以后再推流到CDN流媒体服务器。通过这种方案,将方案一中由主播端做的混音混合及推流操作,转嫁由互动直播服务器来承担。对于普通观众不需要其它额外的处理逻辑就能在原来的拉流地址上拉取到连麦互动的直播画面。
那新方案有哪些优点:
简单的提一下,有些APP使用不同与上述两种方案的其它方案来实现连麦互动直播。也就是主播和连麦者分别发送一路RTMP流到cdn服务器,观众端通过分别拉取主播和连麦者的两路流来实现连麦互动直播。这个方案的问题是:RTMP协议延迟很高,一般至少在3秒,主播和连麦者之间使用RTMP协议来做连麦互动,互动的实时性是不可接受的。同时普通观众要拉取两路流,功能流程会变得复杂,同时还增加了普通观众的下行压力。由于这两个问题,该方案不是一个合格可行的低延迟连麦互动方案。
接下来我们来看看网易云信全新的连麦互动直播方案具体是怎么实现的,这部分内容将是今天分享的重中之重。我们从架构图中可以看出,整个连麦互动直播主要由两大模块组成,实时音视频系统和互动直播服务器系统。
首先我们来看一下实时音视频系统。
实时音视频其实就是基于网络的,能够进行音频或者视频,低延迟的双人或者多人之间的实时通话。像skype,facetime,微信,易信都提供了实时音视频通话功能。在互动直播中,实时音视系统主要是为了实现低延迟连麦功能。
我们来看下实时音视频的架构图:
各平台客户端使用客户端sdk接入实时音视频系统,包括:iOS,Android,PC和嵌入式设备。
客户端与业务服务器集群维持一条APP协议长连接,使用加密的tcp私有协议作为交互协议,主要用于相关业务的发起、通知推送等等。业务服务器集群包括用户加速接入的边缘连接服务器,包括用于为用户智能分配全球媒体服务器节点的分配服务器。客户端通过APP协议从分配服务器获得媒体服务器地址以后,就进入实时音视频的媒体和网络流程。
为了更直观的说明,架构图里展示的是单向流程。左侧是发送方,右侧是接收方。发送方的编解码进行音视频采集、音视频预处理,然后进行音视频的编码,随后进入网络层,在做完私有协议的封包、传输可靠性的保障以后,使用加密的udp私有协议作为传输层协议,将数据包发送到分配服务器根据智能算法分配的媒体服务器集群。通过边缘加速节点到达核心媒体中转服务器,媒体中转服务器负责将数据包转发给同一会话的其他用户。
接着我们来看接收方。同样使用加密udp私有协议,接收方的网络层收到媒体中转服务器发过来的数据包,自底向上首先进行私有协议解包,然后做相关的网络层QoS保障。网络层处理结束以后将完整的音视频编码数据回调编解码层。在编解码层中,首先进行音视频的解码,然后相关音视频后处理,最后将处理完的音频进行播放,并在界面中绘制出视频画面。
这样就完成了一次音视频数据的单向交互,反向的流程一致。另外我们看媒体服务器集群中除了最关键的是中转服务器。还有录制存储服务器用户将通话过程中的音频和视频录制下来,并存储到云端。而统计分析服务器用于分析统计用户的通话质量与系统的运行状态,为优化实时音视频的通话效果很有帮助,同时对于节点分配服务器的策略也有相应参考。
实现的这套实时音视频系统的几大技术要点,主要包括下面四个部分:网络、音频、视频和适配。
有了上面实时音视频部分的介绍,我们就为连麦互动直播的低延迟连麦打下坚实的基础了。
我们接着来看一下互动直播服务器。
下面我们来简单看一下互动直播服务器的多线程异步架构。
互动直播服务器主要由一个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%的服务器使用了配备万兆网卡的高性能物理机。同时对于服务器宕机、网络切断,都使用了相应的恢复和策略切换,所有这些都为了我们实时音视频服务的高可用。
实践:
2015年我们在给网易BOBO windows pc端提供的连麦互动方案就采用了主播端合流的方案,网易BOBO pc端在2015年下半年上线连麦功能后运行稳定,连麦效果得到用户肯定,用户的粘性得到提高。有了网易BOBO pc端的实践,我们可以说方案一在pc上是具备可行性的。现在BOBO移动端正在内测使用我们最新推出的服务端合流新方案。
2016年作为移动直播元年,全球范围内的开发者和公司都在思考如何提供更加优质的服务。我们认为内容永远都是直播发展的王道,作为研发工程师的职责就是为内容的传输保驾护航,提供高清、流畅且延迟低的直播内容。而差异化的功能将成为直播应用的亮点,其中拥有连麦互动的直播应用将会在增加用户的参与度、幸福感的同时提高用户粘性,连麦互动直播的重要性也就不言而喻了。
科技永远都是第一生产力,当前VR虚拟现实技术与直播一样火爆。而VR与直播结合的VR直播能够让观众身临其境,它独特的互动方式或许在不久的将来,就会在直播领域掀起新一轮的变革。当然VR超高分辨率需求也为直播中的网络和音视频编解码提出了很高的要求。但是我坚信,随着科技的进步,这些难点均将被一一克服。而在座的你我,即将迎接并见证这个时代的
·EDN·
【推荐阅读】