跟阿里云技术专家阙寒一起深度了解视频直播CDN技术
网络直播平台现下已经十分火热,很多常见的直播平台都采用了阿里云直播CDN来搭建自身业务。今天,我们请来了阿里云CDN团队技术专家阙寒,来介绍下视频的一些基础知识和视频直播的架构。
在进入正题之前,我们先来了解视频直播相关的名词含义是什么?扫个盲
通常我们所说的视频,是指连续的图象变化每秒超过24帧(Frame)画面以上时,根据视觉暂留原理,人眼无法辨别单幅的静态画面,看上去是平滑连续的视觉效果,这样连续的画面叫做视频。
而媒体转码是指将一段多媒体包括音频、视频或者其他的内容从一种编码格式转换成为另外一种编码格式。
其中内容分发网络就是大家常说的CDN,这里主要包含流媒体服务器,负载均衡,路由重定向,视频转码,视频录制存储,防盗链,性能等相关技术内容。
下面这几个词我们也经常遇到:
码率是数据传输时单位时间传送的数据位数,一般我们用的单位是kbps即千位每秒。通俗一点的理解就是取样率, 单位时间内取样率越大,精度就越高,处理出来的文件就越接近原始文件,但是文件体积与取样率是成正比的,所以几乎所有的编码格式重视的都是如何用最低的码率达到最少的失真。但是因为编码算法不一样,所以也不能用码率来统一衡量音质或者画质。
另一个常见的词是帧,它是一段数据的组合,它是数据传输的基本单位。就是影像动画中最小单位的单幅影像画面,相当于电影胶片上的每一格镜头。一帧就是一副静止的画面,连续的帧就形成动画,如电视图像等。
与之相对应的帧率,即每秒显示帧数,帧率表示图形处理器处理场时每秒钟能够更新的次数。高的帧率可以得到更流畅、更逼真的动画。一般来说30fps就是可以接受的,但是将性能提升至60fps则可以明显提升交互感和逼真感,但是一般来说超过75fps一般就不容易察觉到有明显的流畅度提升了。如果帧率超过屏幕刷新率只会浪费图形处理的能力,因为监视器不能以这么快的速度更新,这样超过新率的帧率就浪费掉了。
华丽丽的分割线
这里阙寒想带我们再展开聊一下视频帧
音频帧一般可以独立解码,可以直播播放。
而视频分为视频关键帧和非关键帧,关键帧可以独立解码渲染,播放器拿到后可以直接看到画面,一般10K以上甚至几十K;其他非关键帧解码依赖于前面的一些视频帧,播放器会根据前面的帧和这一帧来解码产生画面,非关键帧一般大小是几K甚至不到1K。对于播放器来说,服务器一般会从视频关键帧开始发送,这样才不会产生花屏。
对于节点上直播服务器存储的内容,如果是文件加速,节点上存储的内容很明确,就是文件数据,URL不变的话文件数据内容也不变。但是对于直播来讲,传输的就是帧数据,缓存的也是不断变化的帧序列数据。
下面的图里我们可以看到,当前的服务器缓存了V1-V3五帧数据,当V4这个关键帧出现了,服务器把之前的丢掉,开始缓存V4开始的音视频数据,以这个策略保证过来的播放端都是当前最新的数据。一般直播服务器都是用这个策略来进行服务器缓存的。
下面进入正题,常见的CDN加速包括文件加速、点播、直播三种业务。最开始阿里云CDN是从文件加速开始,针对的主要是内部客户,像淘宝,它的图片非常多,那时候支持的都是小文件加速。后来随着各BU的端产品衍生,逐渐会支持大的文件下载业务;等阿里云CDN正式作为产品上线商业化时候,开始支持点播业务。2015年下半年,开始支持直播业务。今天阙寒主要从直播概述、直播架构、业务功能和场景来介绍下阿里云CDN直播系统。
一、直播概述
通常,视频直播常见两种形式是手机直播和游戏直播,手淘、陌陌、映客的典型的手机直播平台,游戏直播就是像斗鱼、全民TV等平台。其实对于播放端来讲,直播和点播都是向服务器获取视频数据,播放端对声音和画面进行播放的过程。从这个角度来讲,直播和点播区别并不大。
那直播和点播究竟区别在哪里?
对于视频点播,你在看的时候,你可以随时选择快进和回退。直播却不能。
对于视频网站上的视频文件来讲,点播可以选择今天看或明天看,但是直播却不能选择时间,像每周末的联赛只在固定的时间播放。一些机顶盒提供回看的功能,也是点播。
所以回归正题,简而言之,直播就是每一帧数据打上时序标签后进行流式传输的过程。发送端源源不断的采集音视频数据,经过编码、封包、推流、再经过分发网络进行扩散传播,播放端再源源不断地下载数据并按时序进行解码播放。如此就产生了边生产、边传输、边消费的直播过程。
我们将视频直播整个流程主要分为几个关键阶段:视频采集、前处理、编码、推流、转码、分发、播放,下图为简化版直播系统的基本架构,后面我们再详细展开。
采集,是视频直播开始的第一个环节,用户可以通过不同的终端采集视频,也就是主播直播的过程。iOS端适配性较好,采集起来比较简单。Android端因为一直以来市面机型多版本复杂种种情况,加大了一个库适配所有硬件的难度,采集起来相对比较困难。PC端则和摄像头驱动联系紧密,目前市面上最好的PC端源免费软件是OBS。
前处理,业内有一种说法,80%的主播没有美颜根本没法看。所以美颜已经是对视频源进行前处理的标配功能,除此之外还有水印、模糊特效等,针对不同的手机系统提供不同的处理库。
编码,编码时候我们需要处理的硬件兼容性问题和寻求码率和画质之前的平衡是最大的两个问题。iOS系统硬件兼容性比较好,可以采用硬编,Android系统则还是因为硬件机型问题,大多采用软编。
推流与转码,在数据传输的整个过程中从主播端到服务器端,再到边缘节点,以及从边缘节点到播放端。为了让采集端的流适配各个平台端不同协议,一般都会在服务端进行转码处理,将视频文件转成不同格式,支持 RTMP、HLS和FLV等不同的协议。
分发,随着移动直播兴起和游戏直播的持续火热,网络直播平台支持亿高并发是理论上应该做到的,为了优化终端观看直播的体验,一般都会采用CDN进行内容分发加速,实现高并发等能力。
客户端播放,也就是解码和渲染,目前 iOS 端的播放兼容性较好,Android 的硬件解码和编码一样也存在兼容性问题。通常秒开、低延时等问题是需要在播放端来克服的。
二、直播架构
这是一张阿里云直播全景解决方案的图,这里包括详细的推流端推流,直播中心的流存储,转码截图录制等视频处理,CDN智能调度与分发,最后到播放端播放整个过程。
对于推流端推流,目前主要使用的是RTMP协议,播放可以使用RTMP、HTTPFLV和HLS协议,常用的推流端是OBS、手机APP、FFmpeg;播放端包括Flash、VLC、HTML5、手机APP等形式;
视频直播中心拥有稳定的推流上行链路,支持连麦、IM、直播间管理等分丰富的直播服务端实现流能力;
CDN直播分发提供流畅的播放下行链路,700多个国内节点和300多个海外节点,还有丰富的小运营商节点。
对于播放端,我们做了首屏秒开优化和弱网跳帧播放,确保用户体验。
对于视频直播服务器的一个进程上来讲,我们可以认为一个推流端和多个播放端是一种非常典型的发布和订阅的关系。从下图可以看到,主播完成发布动作,这条直播内容也就是这一路流推动到服务器,三个观众也就是订阅者,从服务器拉流,也就是用播放动作来完成推流。这种进程内部、节点之间的发布、订阅关系是一种级联的关系,CDN的直播分发就是依靠这种模式构建。
那下面我们从CDN分发的角度来基础架构是怎样的。内容通过存储集群到达发布集群,再通过骨干中转环境的L2,利用CDN智能调度到达L1,也就是距离用户最近的节点,从顺利的推送给用户。
三、业务功能及场景
说完了架构,阙寒带我们来了解业务功能和阿里云CDN的应用场景。对于直播来讲,转码这个业务功能很重要。转码后会在原始流名上加后缀,下图是转码前后的画质、码率的区别。和转码相关的有水印、动态模板、延迟转码等功能。
截图也是比较重要的业务,比如说直播平台页面分类下有很多张图片,刷新后图片会变化,都是靠周期性截图来完成。除此之外,阿里云也开放对直播进行动态配置、录制、开播断流回调、推流播放鉴权、断流、黑名单、禁播、各种接口API、转推其他厂商、触发式拉流、连麦、播放纯音频/视频等。
另外比较重要的是直播数据的监控,对客户和我们来说,能时刻关注直播情况,掌握直播数据,对于防范问题来说是十分必要的。视频监控是用来记录一路流重要信息,比如常见的视频码率、播放流量和在线人数、视频帧率监控。视频的特性是每秒钟帧率比较固定,视频帧大概是20~30帧/秒, 造成卡顿的主要原因一般是网络链路的抖动,有了全链路秒级帧率监控图之后, 排查问题变得非常的方便, 针对一路流卡顿以及客户提出的各种问题可以很快的就明确原因。
正常的监控图应该是一条直线,上图的帧率出现的突刺,就是因为公网网络连接抖动后统计出来的数据降低。对于一路流多个播放端来讲,服务器会不断把帧数据写给播放端,一旦网络抖动,遇到写不出去的情况会将这一帧放到连接的等待队列里,超出了帧队列的长度限制,服务器会选择丢帧。一般这种情况产生是因为网络抖动的比较严重,我们也会以此为依据来确定网络全链路的质量,用红绿颜色来标注区分正常和非正常的链路质量。
那以上的架构和业务功能都可以应用于哪些场景呢?我们也对阿里云视频直播CDN服务的客户场景进行了归类汇总,主要有以下五个方向:
UGC互动直播:不仅提供推流到播放的全套直播解决方案,而且集成成熟的互动解决方案,包括IM,连麦等功能。例如:一直播、映客等直播互动平台。
电商直播:为电商直播提供全套直播解决方案,支持动态扩展的直播技术架构,无需担心直播促销涌入的峰值流量担忧。例如:手淘等电商直播平台。
体育赛事/大型综艺节目直播:为热门的赛事和综艺直播提供动态扩展的直播服务,通过CDN和PCDN的分发,用户无需为突然涌入的流量担忧。例如:CCTV5,等电视直播平台。
游戏直播:对游戏直播提供各种采集设备的接入,以及直播的录制功能,便于游戏直播平台提供点播服务。例如:全民,熊猫,等游戏直播平台。
在线教育/财经直播:提供直播鉴权、直播防盗链、URL加密等功能,为教育、财经类的直播提供安全保障。例如:第一财经等财经平台和知图教育等教育类直播平台。
以上就是阿里云直播CDN相关的内容,目前,超过一半的视频直播、点播平台都在使用阿里云的直播服务,我们会通过不断丰富和升级视频服务能力,打造围绕视频领域的技术生态。
转载于:https://blog.51cto.com/13145856/1948848
相关文章:

一个ASP.NET中使用的MessageBox类
/// <summary>/// 自定义信息对话框/// </summary>public class MessageBox{/// <summary>/// 定义一个web页面,用来显示用户自定错误提示信息/// </summary>System.Web.UI.Page p;/// <summary>/// 实例时,参数为:this 如…

Ubuntu 13.10 安装Terminalx 后更改默认终端设置
1、安装 terminalx, sudo apt-get install terminator 2、Ctrl Alt t 试一下打开什么终端,我的默认启动的是Terminator;如果想换换默认的终端,还需以下一步 3、接下来,安装dconf-tools,这个是设置默认终端的必须 打开…

360数科张家兴:如何突破三大瓶颈,破解金融科技发展难题?
3月6日,上海香港联会、普陀香港联会联合普陀新区联会,IFTA亚洲金融科技师学会共同举办了“沪港合作共创未来”——沪港两地金融科技线上论坛。本次活动通过沪港两地直播连线,探讨两地金融科技领域的发展机遇。麻省理工学院香港创坊执行董事冼…

通过改进算法来优化程序性能的真实案例(Ransac)
对于运行不了几次,一次运行不了多久的方法,我们不需要考虑性能优化,对于那些需要经常运行几百次几千次的方法,我们头脑里还是要有性能这根弦。C#太优雅方便了,以至于很多人写程序时根本就把性能抛到脑后了,…

ASP.NET中使用MD5和SHA1算法加密
你的主页或者你管理的网站有各种密码需要保护,把密码直接放在数据库或者文件中存在不少安全隐患,所以密码加密后存储是最常见的做法。在ASP.NET中实现加密非常容易。.NET SDK中提供了CookieAuthentication类,其中的HashPasswordForStoringInC…

不追逐标准化产品,360数科的一站式风控体系有何不同?
新冠肺炎疫情无疑加速了金融行业数字化转型,竞争者不断涌入,逐渐形成由BATJ、传统银行旗下金融科技子公司、以及专注于金融机构的数字化服务公司构成的竞争格局。然而,风控始终是金融行业的核心。作为定位于中国零售金融领域科技服务商的360数…

基于Bootstrap里面的Button dropdown打造自定义select
最近工作非常的忙,在对一个系统进行改版。项目后台是MVC1.0开发的,但是前端部分已经改过几个版本,而已之前的设计师很强大,又做设计又做前端开发。而已很时尚和前沿,使用了一直都很热门的Bootstrap工具包,有…

HybridDB · 源码分析 · MemoryContext 内存管理和内存异常分析
背景 最近排查和解决了几处 HybridDB for PostgreSQL 内存泄漏的BUG。觉得有一定通用性。 这期分享给大家一些实现细节和小技巧。 阿里云上的 HybridDB for PostgreSQL 是基于 PostgreSQL 开发,定位于 OLAP 场景的 MPP 架构数据库集群。它不少的内部机制沿用了 Post…

联合南京大学,爱奇艺智能论文入选顶会CVPR 2021
日前,全球计算机视觉顶级会议CVPR (IEEE Conference on Computer Vision and Pattern Recognition)公布了2021年论文接收结果。作为计算机视觉领域世界三大顶会(CVPR、ICCV、ECCV)之一,CVPR的论文投稿量近五年来持续大涨。据CVPR官网显示,今…

Forefront_TMG_2010-TMG发布Web服务器
1.环境拓扑图:2.准备DMZ区域的Web服务器:安装Web服务器:在DMZ区域的Web服务器进行测试:3.TMG发布Web服务器:打开TMG管理控制台,新建“网站发布规则”:新建名称:选择“允许”…

ASP.NET实现身份模拟
使用模拟时,ASP.NET 应用程序可以选择以这些应用程序当前正为之操作的客户的身份执行。通常这样做的原因是为了避免在 ASP.NET 应用程序代码中处理身份验证和授权问题。而您依赖于 Microsoft Internet 信息服务 (IIS) 来验证用户,然后将已通过验证的标记…

Mac homebrew类似apt-get命令安装包
INSTALL brew ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)" 其它: 其他brew命令 brew list 列出已安装的软件 brew update 更新brew brew home 用浏览器打开brew的官方网站 brew inf…

asp.net中长内容自动分页的实现
在一篇文章过长时,可以自动的写个小程序对其进行分页.具体代码:public class t3 : System.Web.UI.Page { private string str;//字符 private int strl;//字符总长度 private int pagesize;//每页显示的字符数 …

黑马程序员之List--队列、栈...
--------------------- ASP.NetUnity开发、.Net培训、期待与您交流! ---------------------- 1.队列:先进先出 运行结果: zhangsan lisi wangwu 2.栈:先进后出 结果: lisi wangwu zhangsan 3. 去除重复元素思路&#x…

龙芯架构应用迁移技术分享——搜狗输入法应用迁移
技术引领创新,用“芯”构建生态,第一期龙芯生态论坛将于2021年3月12日(周五)盛大开讲!龙芯生态论坛作为龙芯生态建设的重要技术交流窗口,将汇聚龙芯资深技术专家及行业生态伙伴精英,持续开展行业…

Health Check in eShop -- 解析微软微服务架构Demo(五)
引言 What is the Health Check Health Check(健康状态检查)不仅是对自己应用程序内部检测各个项目之间的健康状态(各项目的运行情况、项目之间的连接情况等),还包括了应用程序对外部或者第三方依赖库的状态检测。 Why…
网易伏羲论文入选 CVPR:AI 感知表情能力或实现巨大突破!
出品 | AI科技大本营(ID:rgznai100)2月28日,人工智能顶级会议CVPR 2021(国际计算机视觉与模式识别会议,Conference onComputer Vision and Pattern Recognition)公布论文录取结果,网易伏羲共有3…

asp.net/c#字符格式化大总结
一、用{0:?}格式化可通过 String.Format 方法或通过 Console.Write 方法格式化数值结果,其中后一种方法调用 String.Format。使用格式字符串指定格式。下表包含受支持的标准格式字符串。格式字符串采用的形式为 Axx,其中 A 为“格式说明符”,…

小鱼提问1 类中嵌套public修饰的枚举,外部访问的时候却只能Class.Enum这样访问,这是为何?...
/// <summary>/// 常量等定义/// </summary>public class General{/// <summary>/// 文件类型/// </summary>public enum FileType{}}小鱼提问:都是public修饰,为何外部只能General.FileType这样访问?既然外部都不能…

radio根据name 获取选中值及判断是否被选中
$(input:radio[name"fjscfs"]:checked).val();根据id判断是否被选中if($("#A26").is(":checked")){}根据class判断是否被选中if($(".A26").is(":checked")){}转载于:https://blog.51cto.com/ty2538402559/1949828

ASP.NET中用healthMonitor属性用
在ASP.NET 2.0中,可以使用healthMonitoring属性监测事件。healthMonitoring属性是一个基于方法的provider,在这里可以构造自己的provider。利用healthMonitoring属性,我们可以诸如记录错语、成功的事件等,对不同的数据源ÿ…

用 Python 动态可视化,看看比特币这几年
作者 | 刘早起来源 | 早起Python头图 | 下载于视觉中国最近几年,一直站在风口浪尖的比特币被追捧为最佳的投资产品,拥护者们认为这种加密货币是一种类似于黄金的储值工具,可以对冲通胀和美元疲软。其他人则认为,比特币的暴涨只是一…

违规用户处理办法
2019独角兽企业重金招聘Python工程师标准>>> 1.简单设置用户信赖状态 给用户设置信任字段,0不可信任,1默认许可(默认值),2可信赖用户 当用户违规后,对其进行惩罚并设置其为 不可信赖状态&#…

linux同步软件
linux同步软件:scp,rsync,inotify,sersync一、scpscp就是secure copy,是用来进行远程文件拷贝的。数据传输使用 ssh,并且和ssh 使用相同的认证方式,提供相同的安全保证 。 与rcp 不同的是,scp 在需要进行验证时会要求你…

C语言内联函数
内联函数也称内嵌函数,它主要解决程序的运行效率。 #####################问题######################################### 函数调用需要建立栈内存环境,进行参数传递,并产生程序执行转移,这些转移都需要时间开销。 有些函数在程序…

Maximum Subarray
Find the contiguous subarray within an array (containing at least one number) which has the largest sum. For example, given the array [−2,1,−3,4,−1,2,1,−5,4],the contiguous subarray [4,−1,2,1] has the largest sum 6. Code: class Solution { public:int …

从Python到AI,这条路好走吗?
大家都在学Python的时候,怎么才能让自己更有竞争力?Python 的应用方向有很多,基本每个方向都是大热门,但至今为止,人工智能行业仍处于人才稀缺的情况。正因这样,近几年来,AI 成为了广大 Python …

微信小程序server-1-搭建HTTPS server
一.使用 Node 和 Express 搭建一个 HTTP 服务器 1.在app.js修改小程序通信域名 App({config: {host: // 这个地方填写你的域名},onLaunch () {console.log(App.onLaunch());} }); 2.安装 NodeJS 和 NPM yum install nodejs npm -y node -v 3.编写HTTP服务源码 touch package.j…

被“钱”困住的开源开发者们!
「Given enough eyeballs,all bugs are shallow.」(只要有足够多的眼睛,就可以让所有 Bug 浮现)1997 年,随着《大教堂与集市》的到来,开源新时代的号角正式吹响,也将 Linus 法则深深地烙印在开源…

PHP连接MySQL的2种方法以及防止乱码
PHP的MySQL配置 报错信息:Class mysqli not found in Answer: 1.在conf/php.ini中,在vim用"/php_mysql"搜索到extensionphp_mysql.dll,去掉前面的";", 同时在下面增加extensionphp_mysqli.dll; 注意后面那个dll多了个i 2."/extension_dir&…