RTMP、HTTP-FLV、HLS,三大直播协议
RTMP
优点:
RTMP 是专为流媒体开发的协议,对底层的优化比其它协议更加优秀,同时它 Adobe Flash 支持好,基本上所有的编码器(摄像头之类)都支持 RTMP 输出。现在 PC 市场巨大,PC 主要是 Windows,Windows 的浏览器基本上都支持 Flash。另外RTMP适合长时间播放,曾经有过测试,联系 100 万秒,即 10 天多连续播放没有出现问题。最后 RTMP 的延迟相对较低,一般延时在 1-3s 之间,一般的视频会议,互动式直播,完全是够用的。
缺点:
一方面是它是基于 TCP 传输,非公共端口,可能会被防火墙阻拦;另一方面,也是比较坑的一方面是 RTMP 为 Adobe 私有协议,很多设备无法播放,特别是在 iOS 端,需要使用第三方解码器才能播放。
运用在现场直播方案:https://sdeno.com/?p=7926
FLV
FLV (Flash Video) 是 Adobe 公司推出的另一种视频格式,是一种在网络上传输的流媒体数据存储容器格式。
优点:
相较于 RTMP 协议,HTTP-FLV 能够好的穿透防火墙,它是基于 HTTP/80 传输,有效避免被防火墙拦截。除此之外,它可以通过 HTTP 302 跳转灵活调度/负载均衡,支持使用 HTTPS 加密传输,也能够兼容支持 Android,iOS 的移动端。
缺点:
由于它的传输特性,会让流媒体资源缓存在本地客户端,在保密性方面不够好。因为网络流量较大,它也不适合做拉流协议。
—————————上述两个协议都是有Adobe公司推出的—————————
HLS
HLS (HTTP Live Streaming) 则是苹果公司基于 HTTP 的流媒体传输协议。
主要应用于 iOS 设备,包含(iPhone, iPad, iPod touch) 以及 Mac OSX 提供音视频直播服务和录制内容(点播)等服务。
相对于常见的流媒体协议,HLS 最大的不同在于它并不是一下请求完整的数据流。它会在服务器端将流媒体数据切割成连续的时长较短的 ts 小文件,并通过 M3U8 索引文件按序访问 ts 文件。客户端只要不停的按序播放从服务器获取到的文件,从而实现播放音视频。
HLS 的优势:
Apple 的全系列产品支持:由于 HLS 是苹果提出的,所以在 Apple 的全系列产品包括 iPhone、 iPad、safari 都不需要安装任何插件就可以原生支持播放 HLS, 现在 Android 也加入了对 HLS 的支持。
穿透防火墙。基于 HTTP/80 传输,有效避免防火墙拦截
性能高。通过 HTTP 传输, 支持网络分发,CDN 支持良好,且自带多码率自适应,Apple 在提出 HLS 时,就已经考虑了码流自适应的问题。
HLS 的劣势:
实时性差,延迟高。HLS 的延迟基本在 10s+ 以上
文件碎片。特性的双刃剑,ts 切片较小,会造成海量小文件,对存储和缓存都有一定的挑战
—————————以上内容都是科普————————————-
这里的教程如何使用HLS协议播放视频。
本人使用的环境是centos6
1,安装nginx,且安装nginx-rtmp-module模块
2,配置nginx.conf
查看mime.types文件是否有以下内容(一般都会有),如果没有就加上
application/vnd.apple.mpegurl m3u8; video/mp2t ts;
编辑nginx.conf
http{ server{ #其他网站 } server{ #其他网站 } server { listen 8080; server_name localhost; location /hls { types { application/vnd.apple.mpegurl m3u8; video/mp2ts ts; } root /tmp; add_header Cache-Control no-cache; add_header Access-Control-Allow-Origin *; } location /on_publish { return 201; } # 推流的监控台 location /stat { rtmp_stat all; rtmp_stat_stylesheet stat.xsl; } location /stat.xsl { alias /opt/nginx/conf/stat.xsl; } location /control { rtmp_control all; } error_page 500 502 503 504 /50x.html; location = /50x.html { root html; } } } #rtmp跟http同级 rtmp { server { listen 1935; #//服务端口 #chunk_size 4096; #//数据传输块的大小 application rtmplive { live on; } application hls { #rtmp推流请求路径 live on; hls on; hls_path /tmp/hls; #去创建这个目录,在tmp目录的文件服务器重启就会删除里面的文件 hls_fragment 10; hls_cleanup off; } } }
配置完成之后重启nginx。
开启的端口是8080和1935,使用命令netstat -ltn查看是否有这两端口。
主要防火墙是否允许对外访问这两端口。
如果你是阿里云服务器,要开启端口查看https://sdeno.com/?p=5797
http://ip:8080/ 看下你的网站是否能访问
关于更多HLS在nginx中的配置可看看https://sdeno.com/?p=7902
3,安装ffmpeg
window 64位的下载:
链接: https://pan.baidu.com/s/1jVOHOIAuEoNpCJQ7XeI7-A 提取码: g333
centos安装:
yum -y install epel-release
CentOS 6比较简单,安装yum源之后直接安装即可:
su -c 'yum localinstall --nogpgcheck https://download1.rpmfusion.org/free/el/rpmfusion-free-release-6.noarch.rpm https://download1.rpmfusion.org/nonfree/el/rpmfusion-nonfree-release-6.noarch.rpm' yum -y install ffmpeg ffmpeg-devel
而CentOS 7需额外安装扩展源:
su -c 'yum localinstall --nogpgcheck https://download1.rpmfusion.org/free/el/rpmfusion-free-release-7.noarch.rpm https://download1.rpmfusion.org/nonfree/el/rpmfusion-nonfree-release-7.noarch.rpm' rpm --import http://li.nux.ro/download/nux/RPM-GPG-KEY-nux.ro rpm -Uvh http://li.nux.ro/download/nux/dextop/el7/x86_64/nux-dextop-release-0-1.el7.nux.noarch.rpm yum -y install ffmpeg ffmpeg-devel
4,视频转m3u8
我是在window环境下转码的,执行
D:\ffmpeg\bin\ffmpeg.exe -i E:\zszz\zszz.mp4 -c:v libx264 -hls_time 10 -hls_list_size 0 -c:a aac -strict -2 -f hls E:\zszz\1.m3u8
没10秒切成一个ts视频,之后你会看到会有一个m3u8格式的文件和一堆ts视频,把这些文件都上传到/tmp/hls目录
5,播放m3u8视频
苹果设备直接就可以播放
<video controls> <source src="1.m3u8"></source> </video>
其他设备的需要第三方插件
<link href="video-js.min.css" rel="stylesheet"> <script src="video.js"></script> <script src="videojs-contrib-hls.js"></script> <video class="video-js video-js vjs-default-skin" id="video1"></video> function run(str,url,type) { var player = videojs(str, { width:1920,//宽string|number height:450,//高:string|number controls:true,//控制条:boolean preload:"none",//预加载:string;'auto'|'true'|'metadata'|'none' // poster:'source/suoluetu.jpg',//预览图:string autoplay:false,//自动播放:boolean loop:true,//循环:boolean muted:true,//静音:boolean fluid:true, sources:[ { src:url, type:type } ], controlBar: { muteToggle: false, volumeMenuButton:false//静音按钮 } }, function () { }); } run('video1','http://xxxx:8080/hls/1.m3u8','application/vnd.apple.mpegurl');
其他测试地址:
https://zuikzy.603ee.com/2019/05/06/Et6dCHH62ojQBCqB/playlist.m3u8
6,总结通过测试了一下把1g的电影视频转成m3u8,在4g下进行播放还是可以的,总比去加载整个mp4文件后在播放实际。
移动端ios和安装都可以播放,window pc端不支持