【入门】无插件web直播解决方案,ffmpeg+nginx-http-flv
作者大da一笔带过的事,可花费我了很长时间尝试。
总结:
wget http://nginx.org/download/nginx-1.1.17.tar.gzgit clone git://github.com/winshining/nginx-http-flv-module.git
2.修改nginx的配置文件
vim /usr/local/nginx/conf/nginx.conf #打开配置文件
...http {include mime.types;default_type application/octet-stream;keepalive_timeout 65;server {listen 80; #http-flv的拉流端口...# http-flv的相关配置location /live {flv_live on; #打开HTTP播放FLV直播流功能chunked_transfer_encoding on; #支持'Transfer-Encoding: chunked'方式回复add_header 'Access-Control-Allow-Origin' '*'; #添加额外的HTTP头add_header 'Access-Control-Allow-Credentials' 'true'; #添加额外的HTTP头}...}
}rtmp_auto_push on;
rtmp_auto_push_reconnect 1s;
rtmp_socket_dir /tmp;rtmp {out_queue 4096;out_cork 8;max_streams 128;timeout 15s;drop_idle_publisher 15s;log_interval 5s; #log模块在access.log中记录日志的间隔时间,对调试非常有用log_size 1m; #log模块用来记录日志的缓冲区大小server {listen 1935;server_name www.test.*; #用于虚拟主机名后缀通配#ffmpeg推流的application application myapp {live on;gop_cache on; #打开GOP缓存,减少首屏等待时间}...}...
}
推流设置
ffmpeg -f dshow -i video="Integrated Webcam" -g 25 -vcodec libx264 -preset:v ultrafast -tune:v zerolatency -f flv rtmp://127.0.0.1:1935/myapp/mystream
-g 25:每隔25帧,插入一个关键帧,可提高缓冲速度。而且延迟不会明显增加。
flv.js的配置
var flvPlayer = flvjs.createPlayer({type: 'flv',enableWorker: true, //浏览器端开启flv.js的worker,多进程运行flv.jsisLive: true, //直播模式hasAudio: false, //关闭音频 hasVideo: true,stashInitialSize: 128, enableStashBuffer: false, //播放flv时,设置是否启用播放缓存,只在直播起作用。url: ''});
效果图:
================================================================================================
++flv.js播放器累计时延的尝试消除
问题:使用中发现,如果最小化播放器的页面,或者进行浏览器页面切换,会增加播放器时延。正如以下资料中描述的“切换前后台带来的累积延时”。转自:
优化切换前后台带来的累积延时
在直播场景中,有一种情况是切换前后台造成累积延时。这里举个例子:在前台时,直播视频在播放,然后退到后台,此时暂停播放器,音视频数据继续缓存,当回到前台时,继续从刚才退出时的视频流数据开始播放,而实际的直播现在已经不在这个时间点了。这段前后台切换的时间里,就积累了一段延时。
对于这种延时改怎么处理呢?
一种解决方法:我最终在flv.js 的相关issue中找到了一种解决方法。代码如下:
setInterval(function () {console.log("时延校正判断");if (!_video.buffered.length) {return;}var end = _video.buffered.end(0);var diff = end - _video.currentTime;console.log(diff);if (diff >= 4) {console.log("进行时延校正");_video.currentTime = end;//alert("时延过长,请点击时延校准");}}, 3000)
这种方法对video..end(0)和video.进行差值判断。若差值大于一定值,自动进行校准。
其原理是:获取了视频的缓冲范围,如果缓存超过一定长度,就跳跃播放。
也可不进行校准,直接停止播放,提醒用户刷新界面(一些直播网站也是这么做的,用户离开时间过长将拒绝播放)。
相关资料:直播中累积延时的优化,低延时直播应用,flv.
感谢网友的资料,感谢群友的思路,感谢各位开源大佬。
================================================================================================
++保存直播视频到服务器
user root; #给Nginx足够的文件访问权限rtmp {out_queue 1024;out_cork 8;max_streams 128;timeout 15s;drop_idle_publisher 15s;log_interval 5s; #log模块在access.log中记录日志的间隔时间,对调试非常有用log_size 1m; #log模块用来记录日志的缓冲区大小server {listen 1935;server_name www.test.*; #用于虚拟主机名后缀通配application myapp {live on;record video; #记录直播视频record_path /tmp/rec; #视频保存路径record_suffix -%d-%b-%y-%T.flv; #视频保存名:日期+.flv....