前言

这篇总结其实是去年公司每周技术分享会轮到我的时候写的。那时候公司正在大刀阔斧地准备直播业务,私以为主管会委以重任,就翻了不少论坛,做了一次简单的技术分享。后来直播业务让另一位同事承担了,自己也就没了实践直播的机会,有点可惜吧。好了,废话不多说,开始我们的理论篇~

技术背景

可以看到,直播从 PC 到一直发展到移动端,越来越多的直播类 App 上线,同时移动直播进入了前所未有的爆发阶段,但是对于大多数移动直播来说,还是要以 Native 客户端实现为主,但是 H5 在移动直播端也承载着不可替代的作用,例如 H5 有着传播快,易发布的优势,同时最为关键的是 H5 同样可以播放直播视频。

2016年是直播元年,一是由于各大宽带提供商顺应民意增宽降价,二是大量资本流进了直播板块,促进了技术的更新迭代。市面上,最常用的是 Apple 推出的 HLS 直播协议(原始支持 H5 播放),当然,还有 RTMP、HTTP-FLV、RTP等。

视频文件格式和直播协议

视频文件格式

视频文件格式实际上,我们常常称作为容器格式,也就是,我们一般生活中最经常谈到的格式,flv,mp4,ogg 格式等。它就可以理解为将比特流按照一定顺序放进特定的盒子里。那选用不同格式来装视频有什么问题吗?

答案是,没有任何问题,但是你需要知道如何将该盒子解开,并且能够找到对应的解码器进行解码。那如果按照这样看的话,对于这些 mp4,ogv,webm等等视频格式,只要我有这些对应的解码器以及播放器,那么就没有任何问题。那么将视频比特流放进一个盒子里面,如果其中某一段出现问题,那么最终生成的文件实际上是不可用的,因为这个盒子本身就是有问题的。

不过,上面有一个误解的地方在于,我只是将视频理解为一个静态的流。试想一下,如果一个视频需要持续不断的播放,例如,直播,现场播报等。这里,我们就拿 TS/PS 流来进行讲解。

  • PS(Program Stream): 静态文件流

  • TS(Transport Stream): 动态文件流

针对于上面两种容器格式,实际上是对一个视频比特流做了不一样的处理。

  • PS: 将完成视频比特流放到一个盒子里,生成固定的文件
  • TS: 将接受到的视频,分成不同的盒子里。最终生成带有多个盒子的文件。

那么结果就是,如果一个或多个盒子出现损坏,PS 格式无法观看,而 TS 只是会出现跳帧或者马赛克效应。两者具体的区别就是:对于视频的容错率越高,则会选用 TS,对视频容错率越低,则会选用 PS。

直播协议HLS

HTTP Live Streaming(简称 HLS)是一个基于 HTTP 的视频流协议。这是 Apple 提出的直播流协议。目前,IOS 和 高版本 Android 都支持 HLS。那什么是 HLS 呢?HLS 主要的两块内容是 .m3u8 文件和 .ts 播放文件。

HLS 协议基于 HTTP,而一个提供 HLS 的服务器需要做两件事:

编码:以 H.263 格式对图像进行编码,以 MP3 或者 HE-AAC 对声音进行编码,最终打包到 MPEG-2 TS(Transport Stream)容器之中;

分割:把编码好的 TS 文件等长切分成后缀为 ts 的小文件,并生成一个 .m3u8 的纯文本索引文件;

浏览器使用的是 m3u8 文件。m3u8 跟音频列表格式 m3u 很像,可以简单的认为 m3u8 就是包含多个 ts 文件的播放列表。播放器按顺序逐个播放,全部放完再请求一下 m3u8 文件,获得包含最新 ts 文件的播放列表继续播,周而复始。整个直播过程就是依靠一个不断更新的 m3u8 和一堆小的 ts 文件组成,m3u8 必须动态更新,ts 可以走 CDN。

这里,我们着重介绍一下客户端的过程。首先,直播之所以是直播,在于它的内容是实时更新的。那 HLS 是怎么完成呢?

我们使用 HLS 直接就用一个 video 进行包括即可:

<video autoplay controls><source src="xxx.m3u8" type="application/vnd.apple.mpegurl" /><p class="warning">Your browser doesn't support video</p>
</video>
复制代码

根据上面的描述,它实际上就是去请求一个 .m3u8 的索引文件。该文件包含了对 .ts 文件的相关描述,例如:

不过,这只是一个非常简单,不涉及任何功能的直播流。实际上,HLS 的整个架构,可以分为: masterplaylist 主要干的事就是根据, 当前用户的带宽,分辨率,解码器等条件决定使用哪一个流。所以,master playlist 是为了更好的用户体验而存在的。

当填写了 master playlist URL,那么用户只会下载一次该 master playlist。接着,播放器根据当前的环境决定使用哪一个 media playlist(就是 子 m3u8 文件)。如果,在播放当中,用户的播放条件发生变化时,播放器也会切换对应的 media playlist。

当然,HLS 支持的功能,并不只是分片播放(专门适用于直播),它还包括其他应有的功能。

  • 使用 HTTPS 加密 ts 文件

  • 快/倒放

  • 广告插入

  • 不同分辨率视频切换

可以看到 HLS 协议本质还是一个个的 HTTP 请求 / 响应,所以适应性很好,不会受到防火墙影响。但它也有一个致命的弱点:延迟现象非常明显。如果每个 ts 按照 5 秒来切分,一个 m3u8 放 6 个 ts 索引,那么至少就会带来 30 秒的延迟。如果减少每个 ts 的长度,减少 m3u8 中的索引数,延时确实会减少,但会带来更频繁的缓冲,对服务端的请求压力也会成倍增加。所以只能根据实际情况找到一个折中的点。

注意:HLS 在 PC 端仅支持safari浏览器,类似chrome浏览器使用HTML5 video标签无法播放 m3u8 格式,可直接采用网上一些比较成熟的方案,如:sewise-player、MediaElement、videojs-contrib-hls、jwplayer。

直播协议RTMP

Real Time Messaging Protocol(简称 RTMP)是 Macromedia 开发的一套视频直播协议,现在属于 Adobe。和 HLS 一样都可以应用于视频直播,区别是 RTMP 基于 flash 无法在 iOS 的浏览器里播放,但是实时性比 HLS 要好。所以一般使用这种协议来上传视频流,也就是视频流推送到服务器。

下面是 HLS 和 RTMP 的对比:

直播协议HTTP-FLV

HTTP-FLV 和 RTMP 类似,都是针对于 FLV 视频格式做的直播分发流。但,两者有着很大的区别。

  • 直接发起长连接,下载对应的 FLV 文件
  • 头部信息简单

现在市面上,比较常用的就是 HTTP-FLV 进行播放。但,由于手机端上不支持,所以,H5 的 HTTP-FLV 也是一个痛点。不过,现在 flv.js 可以帮助高版本的浏览器,通过 mediaSource 来进行解析。HTTP-FLV 的使用方式也很简单。和 HLS 一样,只需要添加一个连接即可:

<object type="application/x-shockwave-flash" src="xxx.flv"></object>
复制代码

直播基本架构

目前较为成熟的直播产品,大致都是以 Server 端和 H5 和 Native(android,ios)搭配实现直播,基本是下图这个套路:

完整的直播可以分为以下几块:

  • 视频录制端:一般是电脑上的音视频输入设备或者手机端的摄像头或者麦克风,目前以移动端的手机视频为主。

  • 视频播放端:可以是电脑上的播放器,手机端的 Native 播放器,还有就是 H5 的 video 标签等,目前还是已手机端的 Native 播放器为主。

  • 视频服务器端:一般是一台 nginx 服务器,用来接受视频录制端提供的视频源,同时提供给视频播放端流服务。

而现行H5类似直播页面,实现技术难点不大,其可以通过实现方式分为:① 底部视频背景使用video视频标签实现播放 ② 关注、评论模块利用 WebScoket 来实时发送和接收新的消息通过DOM 和 CSS3 实现 ③ 点赞利用 CSS3 动画 对于弹幕来说,要稍微复杂一些,可能需要关注以下几点:

  • 弹幕实时性,可以利用 webscoket 来实时发送和接收新的弹幕并渲染出来。

  • 对于不支持 webscoket 的浏览器来说,只能降级为长轮询或者前端定时器发送请求来获取实时弹幕。

  • 弹幕渲染时的动画和碰撞检测(即弹幕不重叠)等等

H5直播方案

使用flv.js做直播

  • 简介

flv.js是来自Bilibli的开源项目。它解析FLV文件喂给原生HTML5 Video标签播放音视频数据,使浏览器在不借助Flash的情况下播放FLV成为可能。

  • 优势

由于浏览器对原生Video标签采用了硬件加速,性能很好,支持高清。同时支持录播和直播。去掉对Flash的依赖。

  • 浏览器依赖

flv.js依赖的浏览器特性兼容列表

1、HTML5 Video

2、Media Source Extensions

3、WebSocket

4、HTTP FLV: fetch 或 stream

  • 原理

flv.js只做了一件事,在获取到FLV格式的音视频数据后通过原生的JS去解码FLV数据,再通过Media Source Extensions API 喂给原生HTML5 Video标签。(HTML5 原生仅支持播放 mp4/webm 格式,不支持 FLV)

flv.js 为什么要绕一圈,从服务器获取FLV再解码转换后再喂给Video标签呢?原因如下:

1、兼容目前的直播方案:目前大多数直播方案的音视频服务都是采用FLV容器格式传输音视频数据。

2、FLV容器格式相比于MP4格式更加简单,解析起来更快更方便。

  • 兼容方案

PC端

1、优先使用 HTTP-FLV,因为它延迟小,性能也不差1080P都很流畅。

2、不支持 flv.js 就使用 Flash播放器播 RTMP 流。Flash兼容性很好,但是性能差默认被很多浏览器禁用。

3、不想用Flash兼容也可以用HLS,但是PC端只有Safari支持HLS

移动端

1、优先使用 HTTP-FLV,因为它延迟小,支持HTTP-FLV的设备性能运行 flv.js 足够了。

2、不支持 flv.js 就使用 HLS,但是 HLS延迟非常大。

3、HLS 也不支持就没法直播了,因为移动端都不支持Flash。

好了,毕竟是入门理论篇,后续如果有业务实践我会更新的,感觉阅读至此,比心~

H5直播入门(理论篇)相关推荐

  1. VR技术原理分析,【VR原理入门理论篇】

    VR技术原理分析,[VR原理入门理论篇],学习研究VR技术必须要了解的理论知识. 目录 1. VR沉浸感和交互作用产生的原理: 2. 关于沉浸感和交互作用的定义 3. 如何生成符合VR要求的虚拟世界 ...

  2. ES搜索(ElasticSearch)入门理论篇

    ElasticSearch理论篇 SQL查询方式 ES相关知识 聊聊Doug Cutting 什么是Lucene 什么是Nutch 演变 Lucene和ES搜索的关系 ES概述 使用者 对比 ES搜索 ...

  3. python爬虫基础入门理论篇(下)

    网络基础 2.1.网络协议 2.1.1什么是协议? 协议可以理解为"规则",是数据传输和数据的解释规则,下图是简单图解 2.1.2.OSI七层参考模型 物理层:可以理解为我们的网线 ...

  4. 图神经网络入门(理论篇)

    图(Graph) 图结构是一种在我们日常生活中常见的结构,很多问题本质上都是图,比如复杂的分子结构以及社交网络等等.一般来说,图最核心的两个组成部分就是节点(node)和边(edge).节点是图中的一 ...

  5. H5直播站点运维笔记一 服务器篇

    H5直播站点运维笔记一 服务器 服务器篇 一.CentOS6基础操作 1. 查看服务器版本 2. 查看服务器性能 3. 文件查找 4. 软件查找 5. 用户系统 6. 远程登录工具 二.FTP ( V ...

  6. H5直播站点运维笔记四 压测篇

    H5直播站点运维笔记四 压测篇 压测篇 一.测试环境 1.CPU 2.内存 3.操作系统 4.WEB环境 二.优化前压测 三.开启opcache优化 四.laravel 缓存配置/路由/类映射加载优化 ...

  7. H5直播答题并不难,看完这篇你也会

    各大平台为了给自家的直播答题争抢流量,已经绞尽脑汁,不断在玩法上进行创新.这场竞争从 iOS 平台蔓延至 Android 平台.目前大多数平台获取用户的方式还是通过分享邀请码,下载 App 的方式进行 ...

  8. linux 获得磁盘 寻道时间,Linux入门篇 —— Linux 磁盘管理之磁盘理论篇 | 七日打卡...

    Linux 磁盘管理之磁盘理论篇 磁盘简介作用: 用来存放数据(二进制方式来管理数据) 分类机械硬盘 固态硬盘 机械硬盘组成盘片: 上面布满磁性颗粒,保存写入数据 主轴: 带动盘片转动,转到磁头的下方 ...

  9. 移动端互动直播(入门篇)

    本文来自网易云社区 前言 本文为手机视频直播开发新手,为了快速入门,利用强大google搜索引擎结合自身理解而整理的"视频直播入门背景知识". 背景知识 名词解释 推流协议 RTM ...

最新文章

  1. SQL Server-聚焦深入理解死锁以及避免死锁建议(三十三)
  2. GridView 与ImageAdapter (笔记)
  3. Cisco pix515配置实例
  4. 集合框架源码分析六之堆结构的实现(PriorityQueue)
  5. 数据库的事务隔离技术 之 MVCC
  6. android mat下载地址,MatLog下载-MatLog(Log获取)下载v1.2.3 安卓版-西西软件下载
  7. linux创建sudo用户_Linux终极指南-创建Sudo用户
  8. 字符串分割--java中String.split()用法
  9. SPP-net论文笔记
  10. Windows 10 怎样管理已连接过的无线网?
  11. python能做什么excel-使用 Python 可以做什么?
  12. 以下文件中的行尾不一致,要将行尾标准化吗?+乱码
  13. 计算机与现代社会英语作文,急求英文翻译 随着现代社会的发展,人工智能已经逐步进入了我们的生活。人工智能带给了我们生活无穷的便...
  14. PADS 去除走线折角处提示和过孔提示
  15. 勇者斗恶龙 java实现
  16. java Zip文件压缩含加密
  17. Andwobble破解
  18. python3报错 TypeError: can’t concat bytes to str 原因与解决方法
  19. JVM-04-运行时数据区-堆,方法区
  20. 代码显示return的用法(c语言和java的比较和整合)

热门文章

  1. fastadmin 使用手记
  2. 笔记助手-EasyNote
  3. CF第633场 (Div. 2)
  4. 有道云笔记同步失败解决方案
  5. 迷雾:我们是否拥有自己的数据?
  6. Qt-忽略黄色警告提示
  7. Android Paint学习总结
  8. 如何在平面设计中使用网格来辅助
  9. 自己做一个短链服务,设计思路分享!
  10. ios markdown 解析_Markdown 使用手册