实时视频流方案对比 - Wed, May 6, 2020
实时视频流方案对比
1. 实时直播协议简介
1.1 RTMP
RTMP是Real Time Messaging Protocol(实时消息传输协议)的首字母缩写。RTMP实际上是现在编码器输出的工业标准协议,基本上所有的编码器(摄像头之类)都支持RTMP输出。 由于RTMP是由Adobe制定的协议,所以需要使用flash插件进行视频的播放。2017年7月25日,Adobe Systems公司宣布,计划在2020年底逐步淘汰Flash播放器插件,所以RTMP的使用会受到限制。
1.2 HLS
HLS (HTTP Live Streaming)是Apple的动态码率自适应技术。它最初是苹果公司针对iPhone、iPod、iTouch和iPad等移动设备而开发的流.现在见到在桌面也有很多应用了,HTML5 是直接支持这个。 HLS实现的方式是将大的视频切割成小的切片,然后通过http协议发送到客户端。在实时视频流中,需要缓存一段时间的视频,然后进行切割。这也导致HLS在实时视频流中有很大的延迟。
1.3 HTTP FLV
HTTP Flv是将RTMP封装到http协议中。为了摆脱Adobe又能在http进行流传输的RTMP的变种。但是在客户端,仍然依赖flash插件。为了摆脱客户端浏览器使用flash,又开发除了flv.js来播放HTTP Flv。
1.4 WebRTC
WebRTC,名称源自网页即时通信(英语:Web Real-Time Communication)的缩写,是一个支持网页浏览器进行实时语音对话或视频对话的API。它于2011年6月1日开源并在Google、Mozilla、Opera支持下被纳入万维网联盟的W3C推荐标准。 WebRTC(Web Real-Time Communication)项目的最终目的主要是让Web开发者能够基于浏览器(Chrome\FireFox…)轻易快捷开发出丰富的实时多媒体应用,而无需下载安装任何插件,Web开发者也无需关注多媒体的数字信号处理过程,只需编写简单的Javascript程序即可实现,W3C等组织正在制定Javascript 标准API,目前是WebRTC 1.0版本,Draft状态;另外WebRTC还希望能够建立一个多互联网浏览器间健壮的实时通信的平台,形成开发者与浏览器厂商良好的生态环境。
2. 协议对比
项目 | RTMP | WebRTC | HLS | HTTP-Flv | NGINX-RTMP |
---|---|---|---|---|---|
协议定制者 | Adobe | Apple | CERN | nginx | |
延迟 | 1~3s | 200ms~400ms | 10s+ | 10s+ | 5s-10S+ |
传输方式 | tcp流 | udp | http | http流 | tcp流 |
视频封装格式 | flv tag | 任何格式 | Ts文件 | flv | flv tag |
数据分段 | 连续流 | 连续流 | 切片文件 | 连续流 | 切片文件 |
H5支持 | 不支持 | 支持 | hls.js f | flv.js 不支持 |
3. 支持性对比
项目 | RTMP | WebRTC | HLS | HTTP-Flv | NGINX-RTMP |
---|---|---|---|---|---|
Microsoft Edge | 不支持 | 12+ | 12+ | flv.js | 不支持 |
Google Chrome | 默认不支持 | 28+ | 30+ | flv.js | 默认不支持 |
Safari | 不支持 | 11+ | 6.0+ | flv.js | 不支持 |
Android | 不支持 | 29+ | 4.1+ | 不支持 | 不支持 |
iOS | 不支持 | 11+ | 3.0+ | 不支持 | 不支持 |
4. 设计方案
4.1 传统方案
视频都通过SRS然后进行视频分发,带宽的压力集中到CDN上。 CDN的带宽限制了客户端同时播放视频的数量和视频的连续性。
4.2 WebRTC
视频通过P2P进行传输,带宽负载平均到视频设备端,相比传统视频流,设备端负载会变大。因为没有了带宽的压力,所以客户端能播放任意设备端能承载的视频数量。
5. 视频分辨率对带宽的影响
视频服务最大的问题点是带宽
- 码率: 视频码率就是数据传输时单位时间传送的数据位数,一般我们用的单位是kbps即千位每秒。 视频码率影响体积,与体积成正比.码率越大,体积越大;码率越小,体积越小。 “码率”就是失真度,码率越高越清晰。
- 帧率: 帧率(Frame rate)是以帧称为单位的位图图像连续出现在显示器上的频率(速率)。 帧率影响画面流畅度,与画面流畅度成正比.帧率越大,画面越流畅;帧率越小,画面越有跳动感。如果码率为变量,则帧率也会影响体积,帧率越高,每秒钟经过的画面越多,需要的码率也越高,体积也越大。
- 分辨率: 分辨率是用于度量图像内数据量多少的一个参数,通常表示成ppi. 影响图像大小,与图像大小成正比.分辨率越高,图像越大;分辨率越低,图像越小。
分辨率 | 帧率 | 码率 | 带宽 |
---|---|---|---|
1280*720 | 20fps | 1500 kbps | 11.71875M |
1280*720 | 15fps | 1300 kbps | 10.15625M |
1280*720 | 10fps | 1000 kbps | 7.8125M |
960*540 | 20fps | 1100 kbps | 8.59375M |
960*540 | 15fps | 900 kbps | 7.03125M |
960*540 | 10fps | 700 kbps | 5.46875M |
640*480 | 20fps | 800 kbps | 6.25M |
640*480 | 15fps | 700 kbps | 5.46875M |
640*480 | 10fps | 500 kbps | 3.90625M |
640*360 | 20fps | 700 kbps | 5.46875M |
640*360 | 15fps | 600 kbps | 4.6875M |
640*360 | 10fps | 400 kbps | 3.125M |
480*320 | 20fps | 600 kbps | 4.6875M |
480*320 | 15fps | 500 kbps | 3.90625M |
480*320 | 10fps | 400 kbps | 3.125M |
176*144 | 15fps | 400 kbps | 3.125M |
176*144 | 10fps | 300 kbps | 2.34375M |
6. 总结
- 传统方案视频流经过服务器,所以视频的播放受到服务器带宽的限制。5M带宽只能支持320P视频的流畅播放。
- WebRTC方案视频流不经过服务器,直接是点对点(P2P)传输,所以对服务器带宽没有要求。