最近对直播有兴趣,研究了一下直播推流的方法
首先需要了解几个协议
- RTMP
- HLS
首先要有一个带有nginx-rtmp-moudle模块的nginx
确定nginx带有nginx-rtmp-moudle模块后,鉴于nginx-rtmp-moudle模块支持hls, 可以直接在nginx配置文件修改
修改nginx配置文件:
$ vim /www/server/nginx/conf/nginx.conf
需要加入rtmp相关代码以及一个直播流的存储设置的代码
配置好之后,点击 '开始推流',rtmp { server { listen 1935; #监听的端口 chunk_size 4000; application hls { live on; hls on; hls_path /www/wwwroot/default/hls;#视频流存放地址 hls_fragment 5s; hls_playlist_length 15s; hls_continuous on; #连续模式。 hls_cleanup on; #对多余的切片进行删除。 hls_nested on; #嵌套模式。 } }
}
配置如下
server{ listen 80; location /hls { #添加视频流存放地址。 types { application/vnd.apple.mpegurl m3u8; video/mp2t ts; } #访问权限开启,否则访问这个地址会报403 autoindex on; alias /www/wwwroot/default/hls;#视频流存放地址,与上面的hls_path相对应 expires -1; add_header Cache-Control no-cache; #防止跨域问题 add_header 'Access-Control-Allow-Origin' '*'; add_header 'Access-Control-Allow-Credentials' 'true'; add_header 'Access-Control-Allow-Methods' 'GET, POST, OPTIONS'; add_header 'Access-Control-Allow-Headers' 'DNT,X-CustomHeader,Keep-Alive,User-Agent,X-Requested-With,If-Modified-Since,Cache-Control,Content-Type'; }
}
其中rtmp 代码段与http同级, server代码段在http里
重启nginx
$ nginx -s reload
防火墙要开放1935端口
直播推流配置:
下载一个obs软件.(https://obsproject.com/)
可以看到在 /www/wwwroot/default/hls/abcd/ 文件夹里生成 index.m3u8 这个文件.
观看直播:
- 采用小程序的方式观看
由于web端解析 m3u8格式的视频比较麻烦,此次使用的是微信小程序的直播组件
<video id="myVideo" src="http://192.168.37.128:80/hls/abcd/index.m3u8"
enable-danmu danmu-btn="{{false}}" controls>video>
成功拉取到直播流, 效果还不错,延时大概15秒.
- 采用web网页falsh的方式观看(是rtmp的方式)
首先要修改nginx配置,增加一个live应用, 不再转化为hls
rtmp {
server {
.......application live {
live on;
record off;
}}
重启nginx,配置OBS ,配置后直接开始推流
网页代码如下:
使用video.js实现rtmp流的直播播放
访问网址: http://192.168.2.139/v.html ,无法播放视频,原因是flash被谷歌浏览器屏蔽了,需要勾选允许,刷新后可正常播放 (注意falsh版本可能不兼容浏览器,需要重新下载adobe flash player)![]()
- 对比了一下,hls播放和rtmp播放的延迟存在较大的差别,rtmp播放延迟在3到4秒, hls播放延迟在10秒以上甚至可能30秒。不过rtmp播放在pc端需要依赖flash,falsh现在不太被浏览器支持,所以播放起来对用户操作不友好, 经测试发现手机上的UC浏览器不支持,无法播放
感谢博主,喝杯咖啡~
还没有人发表评论