nginx + rtmp 流媒体服务器
目前主流的开源流媒体服务
- 流媒体解决方案 Live555 (C++)
- 流媒体平台框架 EasyDarwin (C++,国产精品)
- 实时流媒体播放服务器程序DarwinStreamingSrvr (C++)
- Flash流媒体服务器 Red5 (Java)
- 流媒体服务器 Open Streaming Server (Java)
- FMS流媒体服务器 (Adobe,收费的)
- Wowza流媒体服务器(Java)
- 开源流媒体平台FreeCast(Java)
- 最后就是我们下面说的 Ngix+RTMP插件
一、视频流的获取,可在电脑安装ffmpeg,采集摄像头的视频流然后推送到流媒体服务器上。
ffmpeg命令格式:
ffmpeg -i [输入文件名] [参数选项] -f [格式] [输出文件]
ffmpeg [[options][`-i' input_file]]... {[options] output_file}...
1、参数选项:
(1) -an: 去掉音频
(2) -acodec: 音频选项, 一般后面加copy表示拷贝
(3) -vcodec:视频选项,一般后面加copy表示拷贝
2、格式:
(1) h264: 表示输出的是h264的视频裸流
(2) mp4: 表示输出的是mp4的视频
(3)mpegts: 表示ts视频流
1.列出可用设备:ffmpeg -list_devices true -f dshow -idummy (window)
ffmpeg -f avfoundation -list_devices true -I '' '' (Mac)
2.推流:ffmpeg -f dshow -i video="USB2.0 PC CAMERA" -vcodec libx264 -acodec copy -b 780k -r 60 -preset:v ultrafast -tune:v zerolatency -f flv rtmp://193.112.101.157:1935/hls/test ------(window)
推流优化:-b 780k -r 60 -b 推流流量 -r 码率
-f flv rtmp://IP:1935/hls/test IP推流地址 test 是文件名,可以随便取
二、搭建rtmp + nginx 流媒体服务器(Centos7)
1.下载Nginx解压,并添加rtmp和openssl支持
[root~]# wget http://nginx.org/download/nginx-1.12.1.tar.gz
[root~]# tar -zxvf nginx-1.12.1.tar.gz
2.下载nginx-rtmp-module 并安装
[root~]# yum -y install openssl openssl-devel//安装一下openssl,不然下面可能会报错
[root~]# git clone https://github.com/arut/nginx-rtmp-module.git
[root~]# ./configure --add-module=/替换为自己的安装路径(path/to)/nginx-rtmp-module --with-http_ssl_module
[root~]# make && make install
[root~]# /usr/local/nginx/sbin/nginx //启动nginx
浏览器打开localhost:8080,出现下图成功安装
重启nginx后报错,pid丢失:
去到 sbin目录下 输入下面的指令
nginx -c /usr/local/nginx/nginx.conf
3.配置nginx.conf
在server里添加下面代码
在配置文件最后添加下面这段
#HLS配置开始,这个配置为了`客户端`能够以http协议获取HLS的拉流
location /hls {
# Serve HLS fragments
types {
application/vnd.apple.mpegurl m3u8;
video/mp2t ts;
}
root /home/video;
add_header Access-Control-Allow-Origin *;//跨域配置
add_header Cache-Control no-cache;
}
#HLS配置结束
#error_page 404 /404.html;
# redirect server error pages to the static page /50x.html
#
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root html;
}
server {
listen 1935;
ping 30s;
notify_method get;
application myapp {
live on;
record off;
max_connections 1024;
}
#增加对HLS支持开始
application hls {
live on;
hls on;
hls_path /home/video/hls;
hls_fragment 2s;
hls_playlist_length 3s;
}
#增加对HLS支持结束
}
}
4.nginx操作:
nginx 服务器重启命令,关闭
nginx -s reload :修改配置后重新加载生效
nginx -s reopen :重新打开日志文件
nginx -t -c /path/to/nginx.conf 测试nginx配置文件是否正确
关闭nginx:
nginx -s stop :快速停止nginx
quit :完整有序的停止nginx
其他的停止nginx 方式:
ps -ef | grep nginx
kill -QUIT 主进程号 :从容停止Nginx
kill -TERM 主进程号 :快速停止Nginx
pkill -9 nginx :强制停止Nginx
三、video.js播放m3u8视频文件
<!DOCTYPE html>
<html>
<head>
<title>videojs播放</title>
<link href="./video.css?v=bcd2ce1385" rel="stylesheet">
</head>
<body>
<video id="roomVideo" class="video-js vjs-default-skin vjs-big-play-centered" x-webkit-airplay="allow" poster="" webkit-playsinline playsinline x5-video-player-type="h5" x5-video-player-fullscreen="true" preload="auto">
<source src="/chat/playlist.m3u8" type="application/x-mpegURL">
</video>
<script src="./video.js?v=fc5104a2ab23"></script>
<script src="./videojs-contrib-hls.js?v=c726b94b9923"></script>
<script type="text/javascript">
var myPlayer = videojs('roomVideo',{
bigPlayButton : false,
textTrackDisplay : false,
posterImage: true,
errorDisplay : false,
controlBar : false
},function(){
console.log(this)
this.on('loadedmetadata',function(){
console.log('loadedmetadata');
startVideo();
})
this.on('ended',function(){
console.log('ended')
})
this.on('firstplay',function(){
console.log('firstplay')
})
this.on('loadstart',function(){
console.log('loadstart')
})
this.on('loadeddata',function(){
console.log('loadeddata')
})
this.on('seeking',function(){
console.log('seeking')
})
this.on('seeked',function(){
console.log('seeked')
})
this.on('waiting',function(){
console.log('waiting')
})
this.on('pause',function(){
console.log('pause')
})
this.on('play',function(){
console.log('play')
})
});
var isVideoBreak;
function startVideo() {
myPlayer.play();
//判断视频是否卡住,卡主3s重新load视频
var lastTime = -1,
tryTimes = 0;
clearInterval(isVideoBreak);
isVideoBreak = setInterval(function(){
var currentTime = myPlayer.currentTime();
console.log('currentTime'+currentTime+'lastTime'+lastTime);
if(currentTime == lastTime){
myPlayer.currentTime(currentTime+10000);
myPlayer.play();
if(++tryTimes > 5){
alert('您的网速有点慢,刷新下试试');
tryTimes = 0;
}
}else{
lastTime = currentTime;
tryTimes = 0;
}
},3000)
}
</script>
</body>
</html>
上一篇: wireshark错误QT: XKEYBOARD extension not present on the X server 和/usr/bin/dumpcap permission denied
下一篇: Wireshark抓包工具的使用
推荐阅读
-
Apache、Nginx 服务配置服务器端包含(SSI)
-
在varnish、squid、apache、nginx中选出一个更好的缓存服务器
-
详解Nginx服务器中map模块的配置与使用
-
Nginx服务器下配置使用索引目录的教程
-
Intel发布首款服务器独立显卡:单卡四芯、云游戏+流媒体
-
Nginx配置实例-动静分离实例:搭建静态资源服务器
-
Nginx配置实例-反向代理实现浏览器请求Nginx跳转到服务器某页面
-
Nginx+Tomcat+Https 服务器负载均衡配置实践方案详解
-
详解基于Centos7+Nginx+Tomcat8的负载均衡服务器的搭建
-
linux服务器上使用nginx访问本地静态资源的方法