本文根据 360 高级技术经理殷宇辉在见云沙龙上的演讲整理而成。
大家好,我是来自 360的 殷宇辉,我讲的内容大概包括以下几部分:
1. 移动直播的背景现状
2. 移动直播的基础架构
3. 360直播云发展历程
2016年是直播发展元年,最早的时候Meerkat和Periscope这两款应用引爆了市场。目前国内直播市场几乎是一片红海,大概有两百多个直播APP,在这里面我大概会把它分成四个象限。
直播需求分类
1. 资讯类 。资讯类主要是像传统的演唱会或者体育赛事直播,它的特点是所有的信号都需要经过审核,所以它是一个先审后发、技术上主动加延迟的方式,就是你看到的画面可能是加了大概30秒,或者40秒的延迟。
2. 游戏直播 。大家知道特别火的斗鱼、熊猫等平台,它们的特点第一是信号来源相对单一,主要是OBS录屏。第二是帧率都比较高,大概在30帧以上,对于游戏直播,如果帧率较低会导致画面迟滞。
3. IoT领域 。IoT领域主要以监控为主,大家比较熟悉的有360小水滴、小蚁、萤石,这块它主要的要求是加密传输和低延迟,基本不会走RTMP协议。
4. 泛娱乐 。这是目前兵家的必争之地,已经有大量的APP杀进来了,领头的是映客、YY和花椒这几个,这块机型比较复杂,也强调实时互动性。
基本直播流程
这是一个最简单的直播流程,首先它会通过采集端的采集处理,经过编码封包,编码封包主要使用H264/AAC格式,H265现在还没到大规模商用阶段,编码封包之后就是推流,这块大家可能比较熟悉,如使用开源的libRtmp,然后会推到CDN,CDN里面可能会做一些流分发和流处理,流处理主要是回放和截图的处理以及一些状态回调,在看播端主要是从CDN上拉流,然后进行解码播放。
移动直播基础组件
刚才有同学提到了,如果我们做个创业APP,那应该怎么做合适呢?就目前来说,找一个成熟的云平台就够了。我们专心做业务就好,也就是上图中业务层的事情。 其余的服务组件和直播流的部分都可以包给第三方服务商。
360直播历程
下面是360直播的历程,大家可以从图上看到,我们做直播是比较早的,我们最早进入该领域是在智能硬件特别火的时候,我们做了水滴直播,然后从2015年3月开始决定做花椒直播,做花椒直播到现在,业务方和平台方差不多已经处于相对稳定的状态,所以我们逐渐开始在内部成立一个私有云平台,以支持所有的音视频业务。
目前的现状是,像水滴的并发峰值大概有四万路,属于直播行业相对较高的一个量级。对我们而言,也是一个巨大挑战。当业务量没上去的时候可能没什么问题,但是业务量上去以后一切都是问题。比如存储,我们每天大概有近百T的存储,我们怎么处理这些海量的数据,以及高并发的直播流呢?
水滴直播-业务场景
上面这个图是水滴的一个典型使用场景,它主要是用来看家看店的,最近有不少新闻说用户家进贼了,最后是小水滴自动触发报警,把对应的图像等等信息都存下来,最后公安根据这些信息找到了犯罪嫌疑人。它对底层技术要求比较多:
1.低延时 。
2. 全双工。 全双工的意思是什么呢?就是家里可能进贼了,然后你拿着你的手机,你喊句话摄像头马上就能把你的声音给传出来。就是你在摄像头端,我在APP端,咱俩是可以相互交互的。
3. 数据加密传输。 因为它涉及一些隐私,所以一般不会用RTMP这种协议。
4. 实时云存。 家里 如果发生什么事件,这些事件是能及时在云端存下来的。
5. 能分享。 像一些房地产商,他用水滴实时拍摄样板间的室内全景,然后可以通过H5分享给目标客户,这块我们会进行私有流到公有流的转化。
下面这个图是水滴服务大概的调度流程,大家可以简单看一下,之后我会分模块拆解。
服务流程
首先水滴和花椒这种直播形式不太一样,其他的直播属于主播已经开流了,我只要调度观众端,而水滴的模式是APP端想去看某个摄像头的时候才去调动这个摄像头往上推流,它有一个实时调度这个摄像头去推流的过程。
大家可以看到,当我在APP端请求观看的时候,业务服务器会通过调度中心拿到两个地址,一个是摄像头的推流地址,一个是APP端的看流地址,摄像头会把私有流分发到我们的一个私有网络,APP端拿到这个私有流就可以开播、看播。最下面画的主要是实现H5分享的功能,我们会把私有流在需要的时候经过流转换器,转换成RTMP流之后推到直播源站,让第三方CDN进来回源,这样PC、H5端都可以去看。
后面是我们的云存服务,就是我们有直播,也要有录像,这个录像对手机来说也不能24小时全录,因为成本太高了,它会在流里面去找一些标识,然后把对应的内容存下来,需要观看的时候,如果访问量大的话走CDN,量不大的时候直接走我们的源站。
底层部署
在整体架构底层部署方面,我们是有光纤的,我们在国内重点地区以及海外都有光纤或者专线的互联节点,核心的互联光纤节点主要是负责一些大区域及运营商,南北联通电信这些比较大的区,主要是做一些流转发以及数据处理之类的工作,每个节点之间,都是双向光纤互联。
第二块是二级的区域中心节点,主要负责一些地方大区,像北京联通或北京电信,它会有三通落地,也就是出口可能有电信、联通以及移动,它和我们内部的一级节点是光纤打通的,然后下面和我们边缘的二级节点之间可以走对应的ISP网络,避免跨运营商。
传输协议
大家知道TCP有一些问题,比如拥塞控制等;然后TCP如果加上TLS之后,流程更多,带来的延迟也更大。因为手机直播对延迟要求比较高,传统UDP不可靠,如果用来传音视频,丢包会产生黑屏、花屏这些现象,所以我们自己封装了一个底层传输框架,它提供像TCP、可靠UDP以及不可靠UDP这些传输协议,使用可靠 UDP的时候,能实时控制滑动窗口、吞吐量等方面。经过我们的线上实测,主播上行的UDP连通率在95%以上。弱网等情况下,可靠UDP的表现也远超TCP。
调度系统
我们调度是HTTP服务,它会响应开流、看流的这些请求,返回对应的节点列表,这里我们也是返回多个IP,让客户端去测试,选择最优节点。
大家可以看到,我们的私有网络跟传统CDN不太一样。
1. 它会把自己的一些管理信息,以及节点的负载等信息同步调度给服务器。
2. 我们的运维系统,比如说今天华北或者广州某个节点有网络割接,要把这个节点下掉,那么通过我们的应用系统实时就能下掉,这些信息都会同步给调度服务器,调度服务器本身是无状态的,它挂了之后,重启就可以,它没有持久化的工作。
除了这两块,我们后续还会有些信息返回到调度服务器,比如说根据区域算的实时卡顿率等,具体怎么算待会会讲。这是调度系统的一个基本情况。
分发系统
我们的分发网络,主要是为了水滴的实时流服务,它跟传统的CDN有本质的区别。传统CDN是层次状,金字塔形的,所有的流推上来必须要到最高的顶点再往下分发。就是说:
1. 它的传输链条比较长;
2. 它是一个完全单向的连接,如果要在这个网络上实现我刚才提到的“从APP端说句话,摄像端实时播出来”是不可能的。
基于CDN去改造也是比较困难的事情,所以我们自己在下面做了一个私有的分发网络,它的特点是:
1. 我们所有的连接都是双向的,就是保证能下去,也能反向回来;
2. 我们有一个节点管理的Manager。管理拓扑层次是分层的,原因是因为有些地方的网络节点之间不互通,这时我们会找就近的,所以管理是分层考虑的,但是实时推拉流不是这样做的 ,因为我们有中心节点,记录了实时流的所有信息,以及拓扑情况,所以在进行推拉流的时候,会去内部查询一下。这样的话,你可以实现完全图状的一个网络,就是几乎你可以找到离你最近的一个节点进行拉流,或者推流。
回放服务
评论
直达楼层