# <center >一 、RTMP流媒体传输协</center>
### 简介:
<span style="color:skyblue; font-size:20px"> RTMP (Real Time Messaging Protocol) 实时消息传输协议是一个用于将点播和直播媒体交付给 Adobe Flash 应用 (比如 JW Player) 的体系。RTMP 支持 MP4 和 FLV 视频,AAC 和 MP3 音频。 </span>
### 概览:
> 1. *一般传输的是 flv,f4v 格式流。*
> 2. *RTMP协议发过来的H264视频*
> 3. *H.264是国际标准化组织(ISO)和国际电信联盟(ITU)共同提出的继MPEG4之后的新一代数字视频[压缩格式](https://baike.baidu.com/item/压缩格式)。*
### 优点:
<pre style="background:#333;">
1.RTMP 可以进行视频直播,人们可以在你录制的同时观看视频。
2.RTMP 可以做动态流,播放视频的质量可以根据带宽而自动变化。
3.播放器可以快进到视频的后面部分,这对于大于十分钟的视频很有用 (这一点是 HTTP 下载方式的在线视频无法匹敌的)。
4.播放器维护有一个小小缓冲,避免了视频回放时的重新下载,节省了带宽。
### 缺点:
<pre style="background:#333; ">
但是,请注意 RTMP 也有自身的缺点,最重要的几个是:
1. RTMP 使用了跟 HTTP 不同的协议和端口号,这使得它很容易遭受 (公司) 防火墙的封堵。可以使用 RTMPT (通过 HTTP 通道) 避免这个问题,但这需要服务器付出一定的性能代价。
2.RTMP 数据被流化后传给播放器,这意味着连接的带宽必须要比视频的数据速率大。如果连接中止了几秒,流将卡住。这个问题在很大问题上可以使用包含一个低质量文件的动态流来进行预防。
3.最大的缺点是 RTMP<b>只能工作在 Flash</b>而不能工作在 HTML5。
### 传输方式:tcp流
### 视频封装格式:flv 、tag
------
# <center>二、HLS流媒体传输协议</center>
### 1.简介:
### <span style="color:skyblue; font-size:20px"> HLS(HTTP Live Streaming) 把整个流分成一个个小的基于 HTTP 的文件来下载,每次只下载一些。HLS 协议由三部分组成:HTTP、M3U8、TS。这三部分中,HTTP 是传输协议,M3U8 是索引文件,TS 是音视频的媒体信息。</span>
### 2.优点:
- 使用标准HTTP传输数据,具有较好的网络穿透及防屏蔽性,更易于内容分发网络传输。
- HLS协议本身是支持码率自适应的,客户端可以根据实际网络状况切换到合适的码率播放。
- HLS内容发布服务更简单,对系统设备要求较低,更容易实现负载均衡,并且HLS是无状态协议的HTTP,客户端只需要下载即可。
### 3.缺点:
- 延时较大,尤其是在直播的情况下,一般会有30s左右的延时。
- 内容生成时对编码端性能要求较高。
- 对于点播服务来说, 由于 TS 切片通常较小, 海量碎片在文件分发, 一致性缓存, 存储等方面都有较大挑战.
### 4.传输方式:http流
### 5.视频封装格式:ts文件
# <center>三、 **HTTP-FLV**流媒体传输协<center>
### 1.简介:
<span style="color:skyblue; font-size:20px">即将音视频数据封装成 FLV,然后通过 HTTP 协议传输给客户端。基于HTTP流式IO传输FLV,依赖浏览器支持播放FLV。</span>
### 2.缺点:
相比RTMP,HTTP-FLV会生成一个非常大的http流,只能做主播,只能在手机app播放 2s以上延迟;
### 3.传输方式:http流
### 4.视频封装格式:flv
![image-20200316092828624](C:\Users\17601\AppData\Roaming\Typora\typora-user-images\image-20200316092828624.png)
# <center>四、flv.js</center>
### 1.简介:
<span style="color:skyblue; font-size:20px"> 是由HTML5Flash 视频(FLV)播放器,纯原生 JavaScript 开发,没有用到 Flash。由 bilibili 网站开源。</span>
#### flv.js 做了哪些事:
1. `HTML5 原生仅支持播放 mp4/webm 格式,flv.js 实现了在 HTML5 上播放 FLV 格式视频`
2. `使 Bilibili 网页端平滑过度到 HTML5 播放器,历史遗留不再是障碍`
3. `由于浏览器对原生Video标签采用了硬件加速,性能很好,支持高清。`
4. `同时支持录播和直播`
5. `不再对**Flash的依赖**`
### 2. 概览:
- 一个实现了在 HTML5 视频中播放 FLV 格式视频的 JavaScript 库。它的工作原理是将 FLV 文件流转码复用成 ISO BMFF(MP4 碎片)片段,然后通过 Media Source Extensions 将 MP4 片段喂进浏览器。
- flv.js 是使用 ECMAScript 6 编写的,然后通过 Babel Compiler 编译成 ECMAScript 5,使用 Browserify 打包。
### 3.功能:
+ FLV 容器,具有 H.264 + AAC 编解码器播放功能
+ 多部分分段视频播放
+ HTTP FLV 低延迟实时流播放
+ FLV 通过 WebSocket 实时流播放
+ 兼容 Chrome, FireFox, Safari 10, IE11 和 Edge
+ 十分低开销,并且通过你的浏览器进行硬件加速
4.flv.js依赖的浏览器特性兼容列表
```js
1. HTML5 Video
2. Media Source Extensions
3. WebSocket
4. HTTP FLV: fetch 或 stream
```
### 4.flv.js兼容方案
由于目前flv.js兼容性还不是很好,要用在产品中必要要兼顾到不支持flv.js的浏览器。兼容方案如下:
#### PC端
1. 优先使用 HTTP-FLV,因为它延迟小,性能也不差1080P都很流畅。(公司只有rtmp和hls,并且相关资料很少)
2. 不支持 flv.js 就使用 Flash播放器播 RTMP 流。Flash兼容性很好,但是性能差默认被很多浏览器禁用。(flash2020年12月谷歌不支持,放弃)
3. 不想用Flash兼容也可以用HLS。(延迟高,排除)
4. 用flv.js结合HTML5,结果flv不支持rtmp协议,对于CORS请求,URL方案必须为“ http”或“ https”。
![不支持rtmp开头的协议,只支持http或者https协议](C:\Users\17601\AppData\Roaming\Typora\typora-user-images\image-20200314172046371.png)
5. 猜测:RTMP协议**它有多种变种**那么使用RTMPT封装在Http请求上,可以试一下。(如果封装之后还不行浪费时间与精力)
RTMP工作在TCP之上,默认使用端口1935;
RTMPE在RTMP的基础上增加了加密功能;
RTMPT封装在HTTP请求之上,可穿透防火墙;
RTMPS类似RTMPT,增加了TLS/SSL的安全功能。
#### 最终解决方案:将rtmp流转换成http流,http流可以在,H5 video标签中使用。
#### 我觉得是这样的,不论rtmp、http等协议,都只是传输应用层的数据,只要你能将其数据包中的数据按照原协议格式提取出来,然后重新按照新协议格式包装,就是可以转换的。但是必须对转换的两种协议都有了解。
### 改装videoplayer插件,实现Html直接播放RTMP视频(需要flash插件)