直播 CDN 分发网络(基本业务)


传统直播一般是基于 CDN 网络进行分发,可支持大规模并发(并发数取决于 CDN 网络容量)。与传统 CDN 的大文件,小文件分发不同,由于主播分布区域分散,一般除了提供播放端的下行分发网络外,还提供上行主播推流汇聚网络。只有一些直播内容资源集中的业务方,会要求直播 CDN 直接回自己的源站,如电视台。

上行汇聚

目前传统直播 CDN 上行一般使用 RTMP 协议,当然也有一些使用 UDP(UDP 方式由于需要 SDK 配合,目前行业内有人在做,但是需要绑定 SDK)。另外国外还有使用 http-ts 的方式进行推流的,可参见 nginx-rtmp 项目大神开源的 nginx-ts-module。当然,目前使用这种方式,关键问题还是在于端的支持问题,而该开源项目目前只支持 HLS 和 Dash 的播放。

除了主播推流以外,还有一种方式即从汇聚点到业务方源站去拉流的方式

下行分发

目前下行分发一般使用的协议,rtmp,http-flv,hls 三种协议。这三种协议的优劣,网上已经有很多文章了,一般从终端兼容性,延迟,首屏几个维度去考虑,这里就不在进行比较。

rtmp 和 http-flv

由于 rtmp 协议在发送数据前交互次数较多,比较追求首屏的直播平台一般都会选择 http-flv 协议作为下行分发协议,线上环境测试效果平均会增加 100-200 ms 左右的时间,网络越差,这个值越大。

rtmp 和 http-flv 的延迟可以做到 3s 以内,但是由于网络环境的复杂,过低的延迟会导致卡顿率的提升,所以一般 CDN 会用户接入时,给用户多发几秒钟的数据(一般是 5-8s),填充播放端缓冲区,来抗网络端的抖动。细节技术会在后面的文章中介绍

hls

hls 对 Android 端和 IOS 端支持较好,并且对 P2P 的支持也较好,一般对延迟要求不高的直播平台(如体育赛事)会选用这个协议。

hls 的延迟一般和切片大小有关,一般切片是 6-8s 一个片,这个大小对一般主播推流 GOP 适配最好。过高会导致延迟加大,过低,可能切片里就没有关键帧。一般 m3u8 文件里会有 3 个 ts 文件,播放器会在下完两个片以后,开始播放,并且同时下第三个片。因此一般 hls 的时延在 15s 左右。

当然如果用户调小 GOP(1s),CDN 端将切片方式配置为按 GOP 切片的方式,HLS 实际也可以做到 5s 以内延迟的。当然坏处就是会导致卡顿率变高

其它协议

dash 和 hds

类似 hls 的还有 dash 和 hds。dash 在国外用得比较多,实际原生的 nginx-rtmp 就支持 dash,只不过国内用得比较少。hds 是 adobe 自己搞的切片协议,一般鲜有开源项目支持(SRS 支持,但是应该没有商用 CDN 使用)

http-fmp4

由于 Adobe 宣布退出 Flash,目前也有平台在研究一些替代技术,如 B 站开源的 flv.js,就是在页面上使用 js 将 flv 转封装为 fmp4,然后可以使用 H5 进行观看

目前个人也在研究在 CDN 端加入 http-fmp4 的支持,其实问题还是挺多的。fmp4 虽然可以支持流式播放,但是与 flv 和 ts 这种天生就为流式传输而生的协议不同,fmp4 实际上还是问题比较多的。

  • fmp4 的视频头是放在 moov 中的(stsd box 下),在直播中会遇到变码率的情况,重发视频头,这种对于 fmp4 实际上是不支持的
  • 一个 moof 放几帧数据的问题,由于 mp4 的 box 是按照 box 长度 + box 标签 + box 内容,所以必须知道后面所有数据帧的长度,才能打包一个 moof。这样势必就需要收到好多帧,才能打一个 moof 包,这种方式实际对直播来说是不好的(dash 不存在这个问题)。当然也可以一个数据帧打一个 moof 包,但是取决于是否接受每帧前面加一个 moof 的开销

    补充:nginx-rtmp 中的 dash 打包也是使用的 fmp4 方式,一般是一个 GOP 或者 10M 数据打成一个 moof

UDP

udp 方式,和前面提到的上行使用 UDP 分发一样,下行使用 UDP 同样存在着标准化问题,同样存在 SDK 配合问题。当然,对于直播来说,追求卡顿率,延迟的极致,UDP 后续必然是一种趋势。后面我们会在互动直播中详细讨论

转码

CDN 一般会提供转码服务,一般按照分类可分为在线转码和离线转码两部分

在线转码

一般我们会把截图,水印,直播转码归为在线转码,直播转码又分为主动转码和被动转码两种

  • 直播的截图,一般用于一些审核业务,如直播鉴黄。还有直播平台上,主播封面的贴图等(这种贴图一般会定时更新)
  • 水印,就是在主播的视频中加入直播平台的标签,类似于电视台的台标。这种方式可能是按需的,如一些主播使用直播平台提供的直播工具,在推流出来前就可以打上水印,但是一些主播使用 OBS 推流,就需要 CDN 来加水印。可以通过加参数的方式,告诉 CDN 是否需要加水印
  • 主动转码,即用户推流到 CDN 后就按照客户需求将源流转为几路子码流,播放端可以根据网络情况选择播放码率(如标清,高清,超清等)。这种方式,由于子流已经转出,能够保证首路播放的首屏时间。但是,并不是所有主播都有人观看,实际大的直播平台,有很大比例的主播是没有观众的,转码又是一种很耗资源的业务,因此主动转码对 CDN 的计算资源消耗是很大的
  • 被动转码,即有观看子码流再转码,这种方式会大大降低计算资源的消耗,一般大的直播平台都会选用被动转码的方式,因为对于大主播,第一个人的首屏影响可以忽略不计

对于直播转码一般还会有阶梯转码,如根据主播码率决定要转几档。对于被动转码,可以选择只转出常用的几种码率,对于不常用的码率选择按需的方式。这些都是 CDN 对直播资源的优化处理方式

离线转码

离线转码在直播中主要是对直播录制文件的处理

  • 直播转点播,和直播不同,点播一般更常用的协议是 mp4 和 hls,而直播一般录制使用的是 flv 和 hls。因此需要在录制后将录制文件转封装成 mp4 或 hls
  • 轮播,类似于电视台体育赛事录播功能,将直播内容进行剪辑后,在某个时间段(一般是主播下播时间)循环播放,一般使用录制文件转推直播流的方式
  • 延播,一些直播内容,业务方需要进行审核,审核完成以后再直播出来,如果有问题,及时掐断,有问题的内容就不会再播放出来。这个时间一般在 10 分钟以上,一般直播引擎使用内存进行数据 cache,因此对这种长时间的延播,一般也是使用定时将录制文件重新转成直播流的方式

FLV+H.265(HEVC)

官方标准 FLV 实际是不支持 H.265 的,但是目前很多直播平台为降低带宽成本,CDN 也应业务需求推出了 FLV+H.265 的支持,一般定义的 CodecID 是 12,转码需要对 ffmpeg 进行修改,参考

实测效果,H.265 的转码比 H.264 大很多,对终端的要求也比较高,目前应用还不是很广泛,应该还处于技术孕育阶段

录制

直播的录制一般可以使用 flv 和 hls 两种,nginx-rtmp 的 record 模块支持 flv 的录制,hls 模块支持 hls 的录制(配置不清除分片)。

为什么不用 mp4,主要取决于 mp4 的封装结构和直播特性的兼容问题:

一般支持 mp4 的 fast-open,会把 moov 头放在文件前面,mdat 放在后面。由于 mp4 对各平台 H5 支持的缘故,现在视频平台一般会把 mp4 作为点播的源的封装格式。播放器只要下载完 moov 头,就可以根据 moov 中 stco 标记的每一帧的位置对视频进行拖动

但是,在直播中,数据帧是实时增加的,这样就导致 moov 头会一直变,而无法确认后面数据帧的偏移位置,这样就无法确认 moov 头到底有多大,那紧接着 moov 的 mdat 在整个 mp4 中的偏移量就无法确定,那如何去确认 moov 中 stco 的偏移量

因此 CDN 一般录制更常用的就是对流式传输比较亲和的 flv 和 hls。当然,mp4 也可以像 HLS 一样分片存,但是我们更倾向于后两种方式。而对直播转点播 mp4,通常都是在完成直播后再全部转封装为 mp4,或者播放超过一段时间后转一个 mp4 文件,如 1 小时。

时移

目前时移多使用 HLS 的方式,也有人用 flv 的,但是需要对 flv 进行大文件分片。在直播中,时移一般需要配合录制一起使用

鉴权

鉴权分为上行鉴权和下行鉴权

直播的鉴权一般有以下几种:

  • referer 鉴权,这种主要是下行 http 用,根据 referer 白名单或黑名单方式。比较容易破解
  • 签名算法的方式,上行和下行皆可使用。一般是直播平台根据用户的 key 和 timestamp 参数,加上用户的 secret 算出一个 signature,和用户带上来的 signature 进行比较。timestamp 保证 signature 在一定时间(一般是分钟级别)范围内有效。当然直播平台不可能把 key 放到客户端代码中,一般直播平台会有一套从服务端获取 signature 的方法。
  • 回源鉴权,上行和下行皆可使用。当请求到 CDN 后,CDN 向业务平台 API 服务器进行请求,由业务平台判断是否放行。下行为保证首屏,一般会使用异步的方式,即向向业务平台 API 服务器发送鉴权请求的同时先放行播放端。拿到鉴权结果后,如果是禁播,再通过禁播接口对观众进行断流处理

一般 CDN 可以支持以上一种或多种鉴权进行使用

其它业务

其它业务还包括断流,禁播,开停播通知,观看人数统计等

欢迎访问我的 git doc

直播 CDN 分发网络(基本业务)相关推荐

  1. 笔记 - AliCloud CDN 分发网络简介

    CDN Content Delivery Network 可以提高Client 访问server 的速度.解决最后1公里的传输质量 加入当你的server locate在广州, 但是西安客户的访问就较 ...

  2. 跟阿里云技术专家阙寒一起深度了解视频直播CDN技术

    网络直播平台现下已经十分火热,很多常见的直播平台都采用了阿里云直播CDN来搭建自身业务.今天,我们请来了阿里云CDN团队技术专家阙寒,来介绍下视频的一些基础知识和视频直播的架构. 在进入正题之前,我们 ...

  3. 深度了解视频直播CDN技术

    网络直播平台现下已经十分火热,很多常见的直播平台都采用了阿里云直播CDN来搭建自身业务.今天来介绍下视频的一些基础知识和视频直播的架构. 在进入正题之前,我们先来了解视频直播相关的名词含义是什么?扫个 ...

  4. EasyDSS高性能RTMP、HLS(m3u8)、HTTP-FLV、RTSP流媒体服务器解决方案之CDN内容分发网络

    背景分析 EasyDSS流媒体解决方案提供一站式的转码.点播.直播.录像.检索.时移回放服务,极大地简化了开发和集成的工作,并且EasyDSS支持多种特性,完全能够满足企业视频信息化建设方面的需求.其 ...

  5. 干货!CDN内容分发网络实战技巧

    干货!史上最全的CDN内容分发网络实战技巧 整理自[微学堂]第二十四期课程实录 嘉宾介绍 白金,ChinaUnix 资深版主,曾担任<iptables 高级使用研讨>讲师,精通iptabl ...

  6. 运维小知识之CDN内容分发网络原理解析

    0x00 前言简述 基础概念 工作原理 组成部分 应用场景 0x01 基础配置 CDN 入门配置 CDN 跨域设置 CDN 响应头参数 (扩充) 0x02 边缘脚本与程序 EdgeScript - 边 ...

  7. 阿里云ACP认证之内容分发网络CDN知识整理(考题占比 3%)

    文章目录 什么是内容分发网络CDN? 阿里云内容分发网络CDN分布 中国境内 中国境外 内容分发网络CDN构成与原理 内容分发网络CDN构成 内容分发网络原理 阿里云内容分发网络CDN优势 内容分发网 ...

  8. 一文搞懂CDN(内容分发网络),涉及HTTP静态资源、DNS支持、GSLB(全局负载均衡)、云服务器

    一.什么是 CDN ? 全称是 Content Delivery Network/Content Distribution Network,翻译过的意思是 内容分发网络 .CDN让用户实现了对资源的就 ...

  9. 基础知识之CDN内容分发网络原理解析

    文章目录 0x00 前言简述 基础概念 工作原理 组成部分 应用场景 0x01 基础配置 CDN 入门配置 CDN 跨域设置 CDN 响应头参数 (扩充) 0x02 边缘脚本与程序 EdgeScrip ...

最新文章

  1. C++乘法的int越界问题
  2. Hive的“rowid”
  3. WinCvs提示:import requires write access to the repository
  4. pandas读取大文件csv容易出现的错误
  5. SharpMap分析手记
  6. Zookeeper知识点详解
  7. wireshark、tcpdump、dsniff、Ettercap、NetStumbler、netsniff-ng
  8. 图像控制点 形变_基于控制点的图象变形方法及其应用
  9. web前端最全各类资源
  10. 爬虫练习:爬豆瓣读书的短评
  11. haneWIN搭建Win10 NFS服务器
  12. 常见五大开源网络监控软件测评分析
  13. 雄迈录像机开放哪些端口
  14. ie无法下载 无法打开该internet站点.请求的站点不可用或无法找到.请稍后重试
  15. 什么是WIFI 探针?WIFI 探针的用途有哪些?
  16. 稳捷教育行业解决方案
  17. Python - 如何用turtle库画一个微笑表情包
  18. 用dos2unix批量转换文件
  19. 17开头的是什么号码?为什么17开头手机号最好不要用
  20. 手把手教大家在自己的Windows电脑上搭建一个视频电话系统(基于开源项目FreeSwitch+Linphone)

热门文章

  1. colab Notes
  2. 【酷炫雪花飞舞特效】(HTML+JS+CSS+效果+代码)
  3. gene prediction commend 2
  4. mycat读书笔记2-Mycat 中的概念
  5. 利用一个核雄性不育基因构建杂交水稻雄性不育系统
  6. 经典卷积神经网络模型
  7. 如何使用php语言创造出表格,【后端开发】php语言怎么做表格
  8. AIGW40N65H5英飞凌车规MOS管\原装现货\ASEMI代理
  9. BUU BRUTE 1(burpsuite爆破初学)
  10. 数字转人民币(大写汉字)读法(Python经典编程案例)