阿里云CDN直播架构与双11晚会直播实战
摘要: 分享人:阿里云CDN直播 高级技术专家 阙寒分享内容:双11直播活动是众多直播活动中非常典型的场景,离不开直播本身这个话题。所以今天的分享会从直播概述、直播架构、业务功能、直播监控、双11这几个方面来进行。
分享人:阿里云CDN直播 高级技术专家 阙寒
分享内容:双11直播活动是众多直播活动中非常典型的场景,离不开直播本身这个话题。所以今天的分享会从直播概述、直播架构、业务功能、直播监控、双11这几个方面来进行。
每年双11购物节,有两块压力是最大的,第一块是支付宝交易,第二块就是CDN。那么CDN技术到底是什么呢?
举个简单例子,不管你的在电脑淘宝上还是手机APP上买东西,进入商品详情页,你会看到很多图片,有的商家为了更好的宣传,会上传视频,让你看得更形象。当商家把图片和视频上传到服务器时,一般是阿里巴巴的主站机房,存储在杭州。但是看这个商品详情的人,可能来自遥远的东北或海南,如果他们直接访问杭州机房,那这个链路会非常长,还存在跨运营商的问题,体验会很差,表现出来就是图片刷不出来等问题。通过CDN技术,可以把这些在杭州机房的图片、视频等静态文件分发到全国各地的几百个机房内,这样,北京用户在看产品详情的时候,直接访问北京的机房,而且是网内覆盖(电信用户访问电信机房),这样就能就近、快速获取数据。而且,对于一个商品详情页的构成,数据量最大的就是图片和视频,其他文本几乎可以忽略不计,对于图片和视频的内容分发极速可以保障用户的体验更加顺畅。
视频直播概述
直播大约是从2014年左右兴起,以映客、斗鱼、熊猫TV、战旗TV这些直播平台为代表。其实主要有两种场景,一种是手机直播,一种是游戏直播。手机直播推流端和播放端都是各平台自己开发的手机APP,而游戏直播是使用开源的OBS去推流完成上传,播放大多是通过网页播放器完成播放。
视频直播和点播的相同点与不同点
其实对于播放器来说,不管是视频直播还是点播,行为都是一致的:和服务器建立连接以后,不停的读取音视频文件,然后完成渲染。从这里来看,视频点播和直播的区别不大。而它们的主要区别就是点播可以快进、后退进行观看,也可以在任意时间播放,而直播不能快进,也只能在固定的时间点播放。
阿里云直播全景解决方案
推流端经过一次边缘节点的加速,将视频直播流推到直播中心,在直播中心完成一系列转码、截图、录制、水印等处理,然后视频流再经过CDN分发,分发到不同的播放端,播放端有不同的SDK进行秒开、弱网等优化动作。
直播服务的特点——直播系统中的推流与播放
对于视频直播来讲,最重要的两个环节,一个是推流,一个是播放。推流一般采用RTMP协议,常用的推流端包括OBS、手机APP、FFmpeg等。播放除了采用RTMP协议,还可以采用HTTP FLV和HLS协议,RTMP和HTTP FLV是流式传输,HLS是文件加速传输,常见的播放端包括:Flash / VLC / HTML5 / 手机App等等。对于阿里云直播系统来讲,大部分直播分发都是通过流式传输完成的,只有一少部分量是使用文件加速分发完成的。
直播服务的特点——详解流式分发与CDN直播系统
我们再详细看下流式分发。其实在直播场景中,不管是推流还是播放,流式分发都是长连接的,一场直播可能2个小时,推流在这2小时内不会中断。对于播放器来讲,服务器端获取到的是一帧一帧的音视频数据,不管是什么传输协议,都是采用FLV tag来封装。每一帧音频或者视频,都会有一个时间戳的属性。
下面这张图列了一下推流和播放端、服务器之间的关系。我们可以定义推流和播放关系为发布与订阅关系。
对于左侧的服务器A来讲,有两路流。第一路流中,主播直接推流到A服务器上(发布),然后这路流有两个播放端,也就是两个订阅者。而第二路流,这路流有三个订阅者,发布端并不是主流推流,是从服务器B拉流过来进而完成发布的,而这个回源链接对于服务器B来是个订阅者,服务器B的发布者是主播推流。这种服务器与服务器之间的级联关系,就构成CDN直播网络。
直播服务的特点——音视频帧与延迟的产生
视频直播流会传输音频帧和视频帧,对于音频帧来讲,它每一帧都可以独立解码,播放器从服务器获取到任何一帧音频帧之后,都可以独立渲染,听到声音。
而视频帧分为视频关键帧和视频非关键帧两类,视频关键帧可以独立解码渲染,可以直接看到画面,其他非关键帧则做不到,它的解码依赖于前面的视频帧。视频关键帧的优点在于独立解码,但是缺点是携带的信息很多、很大。反之,视频非关键帧则很小,几K或者1K就可以解决。对于视频直播的任何一次播放,都是从视频关键帧开始发送,否则会先出现花屏,体验很差。
我们将两个视频关键帧之间的间隔为一个GOP,这是很重要的概念。下图是一路流的音视频序列,我们可以看到两个key(视频关键帧)中间大概有10秒间隔,下侧的箭头指示的是当前推流所在的位置,后续的虚线是即将要推上来的流。此时,前一个关键帧大概在3秒前出现,如果这时来了一个播放端,那么我们不能从箭头开始发给播放端,因为会花屏。所以我们会选择从前面的关键帧开始发送,也就是说,这时的播放端会从3秒之前开始播放,这也就产生了延迟。这个GOP越大,平均延迟也就越大。GOP越小,平均延迟也就越小。一般,手机直播的延迟在2-4秒,游戏直播延迟在8-10秒。
直播服务特点——服务器缓存数据
之前提到的CDN图片、视频加速,它们在每一个边缘服务器、中间服务器、源站服务器都是以一个一个文件形式来存储的,今天和明天访问文件的数据是不变的。而对于视频直播来讲,存储的数据都是实时在变化的。服务器会存储最近的关键帧以来的数据,每当一个新关键帧出现之后,都会将之前的缓存数据清掉。这样才能保证任何一个时间点来播放的播放端都能从最新进度开始观看直播。
CDN直播架构和业务功能
CDN直播网络架构图,这个架构图就是建立在发布与订阅的关系之上。从左侧的主播推流开始,主播推流到L1边缘节点,再经过L2节点的上行加速,最终到中心机房。对于最右侧的播放端来讲,他们从就近的L1节点完成播放,L1节点一般就是本地覆盖的边缘节点,如果机房内有这路视频流,就直接返回,如果机房内没有这路视频流,就从L2节点拉流,如果L2不命中,最终会去中心机房寻找这路流。这其中,任何的链路都会存在抖动状况,CDN会通过自动切换调度来保证稳定性。
直播中心
直播中心在整个CDN直播系统中非常重要,这中间有一些比较重要的组件。包括流媒体服务器,用于用户存储成千上万路直播流;视频处理组件用来完成转码、截图、录制、切片业务;拉流组件用于解决不是主动推给直播中心的需求;调度组件用来完成每一路流在服务器上查找的问题;直播API一般供客户来访问在线流和历史流的数据;监控组件是供客户来监控每一路流、服务器和组件的稳定性的。
转码业务
还有一个和直播密切相关的就是转码业务。左侧图是一路流转码之前的原始画面,当前码率大约是3000K+,右侧转码出来的视频是300K+。一般转码应用在帮助直播平台节省带宽和处理一些播放端不是很顺畅的场景之下。
截图业务
对视频流周期性的截取关键帧,保存成一张图片。一般用在直播平台对于每个直播间做缩略图来用。用户在直播平台看到了直播间缩略图,过一会儿刷新后是会变化的,这就是通过截图来完成的。
除此之外,整个直播系统中还包括其他业务,比如录制、回调、鉴权、黑白名单、转推其他厂商、播放纯视频纯音频等。
直播监控相关
视频直播有很多属性,所以对其监控是十分必要的,我们一般来监控以下指标:
直播视频码率:一般来说,手机直播码率在500Kbps ~ 1Mbps,游戏直播 码率在1.5Mbps ~ 4Mbps左右。
直播视频播放:监控直播的当前在线人数和总体下行流量大小。
视频帧率(卡顿):因为视频/音频有个特性,它的帧率是固定的,音频30 ~ 60帧/秒,视频15 ~ 40 帧/秒。如果一路流很正常,帧率是一条平滑的直线,如果出现突刺,那么就说明有网络抖动。有了全链路秒级帧率监控图之后, 排查问题变得非常的方便, 针对一路流卡顿以及用户的各种问题可以很快的就明确原因。
全链路监控:对于整个分发链路监控,根据客户的反馈通过全链路监控准确找到问题所在,把有问题节点下掉,或者将链路切换。
双11晚会直播相关预案
最后,我们来看看双11晚会直播中,我们做了哪些预案。其实,从15年开始,双11就有了晚会直播。这个晚会是为了双11进行造势和导流,稳定性非常重要,保障级别会很高。下图是整体拓扑图,基本上和双11直播晚会相关的预案都在这里。
最左侧是现场导播车,分出的信号会将视频流推到直播中心。常规的主播会通过公网推到直播中心,抖动的可能性也会很大,双11晚会会选择专线来推流到直播中心。而且,预案不会只选择一根专线,因为一根专线也可能会成为单点,存在一定风险,所以我们一般选择不同运营商的两根专线,确保链路传输。
从现场采集出来的画面,我们可以看到会有四路,narrow这路流其实是我们采用了窄带高清技术的画面。sh01和sh02是不同专线的互备,sh01_narrow和sh02_narrow也是不同专线的互备,而且sh01的画面使用了主推和冷备两条链路,来防止现场推流设备出现的问题。假设真的某路流出现问题了,会通过播放端对ur来进行更换。
双11直播晚会转码——窄带高清
双11直播晚会采用了窄带高清技术,窄带高清是阿里视频云独有的一套以人眼主观感受最优为基准的视频编解码算法,从这里参数来看,窄带高清和非窄带高清使用的码率峰值和平均码率值是基本一样的,但是窄带高清的画质效果会更好。它具有以下特点:
能和编码标准的进步垂直发展,效果能够叠加
能把业界普遍浪费的带宽节省下来,节省20%左右
能把业界普遍处理不好的复杂场景优化
能让普通观众一眼就能看出画质的效果不同
程序盯屏预案
对于双11来讲,我们也会有一个盯屏的策略,通过程序对所有流进行播放,输出一个帧率。转码流每秒钟是25帧左右,中间高亮出来的,就是网络或转码存在问题。一旦发现问题,就采取相应的预案。
人肉查看视频预案及其他
排除了网络问题之外,也可能存在音画不同步、现场采集画面出现花屏等情况,所以针对不同播放端类型,也会有人肉查看每路流的实际效果。此外,运营同学也会检测总体流量和CDN节点水位的情况,如果说流量带宽很高,我们也会采取降低码率等措施来节省带宽。