基于Nginx实现RTMP流媒体的推流和拉流方案
目录
1.4.1安装依赖和下载nginx-rtmp-module源码
3.1 4G/5G DTU视频模块+Nginx 实现云服务器web监控
4.1 Ffmpeg将MP4视频文件转为rtmp流媒体时,报错:
Nginx配合插件nginx-rtmp-module可以做RTMP流媒体服务器,实现RTMP的拉流和推流。本方案可以用于摄像头通过4G/5G DTU模块推流RTMP到云服务器上的nginx服务器,然后通过web查看摄像头实时数据;配合DTU推流模块可以用于RMTP直播服务器; 配合ffmpeg也可以用于视频文件转RTMP流媒体服务器.
本方案使用Ubuntu18.04操作系统,其他的linux发行版替换使用相应的安装命令即可。
1 Nginx 安装nginx-rtmp-module插件
不论何种安装方式,安装nginx-rtmp-module插件都要nginx源码编译,重新生成安装文件。
所以需要下载nginx和nginx-rtmp-module源码
1.1全新安装
此步骤适用于没有安装nginx的系统。
1.1.1安装nginx依赖包
sudo apt-get install build-essential
sudo apt-get install libtool
sudo apt-get update
sudo apt-get install libpcre3 libpcre3-dev
sudo apt-get install zlib1g-dev
sudo apt-get install openssl libssl-dev
1.1.2下载nginx-rtmp-module源码
使用git下载$ git clone https://github.com/arut/nginx-rtmp-module.git
也可以到github网站,直接http下载zip包https://github.com/arut/nginx-rtmp-module
本文放在目录/local/nginx-rtmp-module
1.1.3 Nginx源码安装
从 http://nginx.org/en/download.html选择你想要的版本,既然是全新安装,就选择最新稳定版本就好了,当前的最新稳定版本为1.18.0
下载:$ wget http://nginx.org/download/nginx-1.18.0.tar.gz
解压: $ tar -zxvf nginx-1.18.0.tar.gz
进入解压目录:$cd nginx-1.18.0
运行Configure:
$./configure --prefix=/usr/local/nginx --add-module=/local/nginx-rtmp-module --with-http_ssl_module
/local/nginx-rtmp-module: 为下载的nginx-rtmp-module源码所在的目录
--prefix=/usr/local/nginx:为你希望的nginx安装目录
编译:$make
安装:$sudo make install
至此nginx就安装完成了。
运行 $ /usr/local/nginx/sbin/nginx 能正常启动,说明安装成功
1.2 升级安装
如果系统中已经安装了nginx,并在使用中,就需要升级安装nginx-rtmp-module。
1.2.1安装依赖和下载nginx-rtmp-modul
先按照1.1.1和1.1.2节安装依赖包和下载nginx-rtmp-module
1.2.2 升级nginx
- 首先查看系统中nginx的版本,运行: $/usr/sbin/nginx -V
输出如下:
$ /usr/sbin/nginx -V
nginx version: nginx/1.14.0 (Ubuntu)
built with OpenSSL 1.1.1 11 Sep 2018
TLS SNI support enabled
- 可知版本为1.14.0,到http://nginx.org/en/download.html下载相应的源码包
- 编译新的nginx
解压: $ tar -zxvf nginx-1.14.0.tar.gz
进入解压目录:$cd nginx-1.14.0
运行Configure:
$./configure --with-cc-opt='-g -O2 -fdebug-prefix-map=/build/nginx-GkiujU/nginx-1.14.0=. -fstack-protector-strong -Wformat -Werror=format-security -fPIC -Wdate-time -D_FORTIFY_SOURCE=2' --with-ld-opt='-Wl,-Bsymbolic-functions -Wl,-z,relro -Wl,-z,now -fPIC' --prefix=/usr/share/nginx --conf-path=/etc/nginx/nginx.conf --http-log-path=/var/log/nginx/access.log --error-log-path=/var/log/nginx/error.log --lock-path=/var/lock/nginx.lock --pid-path=/run/nginx.pid --modules-path=/usr/lib/nginx/modules --http-client-body-temp-path=/var/lib/nginx/body --http-fastcgi-temp-path=/var/lib/nginx/fastcgi --http-proxy-temp-path=/var/lib/nginx/proxy --http-scgi-temp-path=/var/lib/nginx/scgi --http-uwsgi-temp-path=/var/lib/nginx/uwsgi --with-debug --with-pcre-jit --with-http_ssl_module --with-http_stub_status_module --with-http_realip_module --with-http_auth_request_module --with-http_v2_module --with-http_dav_module --with-http_slice_module --with-threads --with-http_addition_module --with-http_geoip_module=dynamic --with-http_gunzip_module --with-http_gzip_static_module --with-http_image_filter_module=dynamic --with-http_sub_module --with-http_xslt_module=dynamic --with-stream=dynamic --with-stream_ssl_module --with-mail=dynamic --with-mail_ssl_module --add-module=/local/nginx-rtmp-module
注意:configure参数中黑色字体部分为nginx -V的输出,它是原来老的nginx的编译选项,红色字体部分为新加选项以支持nginx-rtmp-module 。/local/nginx-rtmp-module: 为下载的nginx-rtmp-module源码所在的目录
编译:$make
注意:只运行到make就可以了,不要运行make intall。因为我们是升级安装。
最后,将编译成功的nginx 文件替换/usr/sbin/nginx就可以了。
1.3 基于openresty全新安装
Openresty是集成了nginx的高性能服务器端解决方案。Openresty中的nginx中安装nginx-rtmp-module插件来支持RTMP流媒体服务,也是可以的。Openresty的源码中已经包含了nginx的源码。所以直接下载Openresty的源码包即可。
1.3.1 安装依赖
$ apt-get install libpcre3-dev libssl-dev perl make build-essential curl
1.3.2下载nginx-rtmp-module
按照1.1.2节下载nginx-rtmp-module源码
1.3.3 Openresty源码安装
到http://openresty.org/cn/download.html 下载最新版本的Openresty源码包openresty-1.15.8.3.tar.gz。
解压:$tar -xzvf openresty-1.15.8.3.tar.gz
进入解压目录:cd openresty
运行configure: $ ./configure --prefix=/usr/local/openresty --add-module=/local/nginx-rtmp-module
/local/nginx-rtmp-module: 为下载的nginx-rtmp-module源码所在的目录
--prefix=/usr/local/openresty:为你希望的openresty安装目录
编译: $make
安装: $sudo make install
运行 /usr/local/openresty/nginx/sbin/nginx 如果能正常启动,说明安装成功。
1.4 基于openresty升级安装
如果系统中已经安装openresty并在使用中,就需要升级openresty来支持nginx-rtmp-module插件。
通过源安装openresty: sudo apt-get install openresty
1.4.1安装依赖和下载nginx-rtmp-module源码
按照1.3.1和1.3.2安装依赖和下载nginx-rtmp-module源码
1.4.2升级openresty
首先运行 /usr/local/openresty/bin/openresty -V
输出为:
/usr/local/openresty/bin$ ./openresty -V
nginx version: openresty/1.15.8.2
built by gcc 7.5.0 (Ubuntu 7.5.0-3ubuntu1~18.04)
built with OpenSSL 1.1.1 11 Sep 2018
TLS SNI support enabled
configure arguments: --prefix=/usr/local/openresty/nginx --with-cc-opt=-O2 --add-module=../ngx_devel_kit-0.3.1rc1 --add-module=../echo-nginx-module-0.61 --add-module=../xss-nginx-module-0.06 --add-module=../ngx_coolkit-0.2 --add-module=../set-misc-nginx-module-0.32 --add-module=../form-input-nginx-module-0.12 --add-module=../encrypted-session-nginx-module-0.08 --add-module=../srcache-nginx-module-0.31 --add-module=../ngx_lua-0.10.15 --add-module=../ngx_lua_upstream-0.07 --add-module=../headers-more-nginx-module-0.33 --add-module=../array-var-nginx-module-0.05 --add-module=../memc-nginx-module-0.19 --add-module=../redis2-nginx-module-0.15 --add-module=../redis-nginx-module-0.3.7 --add-module=../rds-json-nginx-module-0.15 --add-module=../rds-csv-nginx-module-0.09 --add-module=../ngx_stream_lua-0.0.7 --with-ld-opt=-Wl,-rpath,/usr/local/openresty/luajit/lib --with-stream_ssl_module --with-stream_ssl_preread_module --with-http_ssl_module
通过输出可知openresty的版本为1.15.8.2
到http://openresty.org/cn/download.html 下载相应版本的Openresty源码包
- 解压:$tar -xzvf openresty-1.15.8.3.tar.gz
- 进入解压目录:cd openresty
- 运行configure: $ ./configure --add-module=/local/nginx-rtmp-module
/local/nginx-rtmp-module: 为下载的nginx-rtmp-module源码所在的目录
- 编译: $make
注意,不要运行make install
编译成功的nginx可执行文件在: ./build/nginx-1.15.8/objs/nginx
使用此文件替换/usr/local/openresty/nginx/sbin/nginx即可
重新启动openresty, $sudo systemctl restart openrest, 如果能正常启动,则升级成功。
2 nginx rmtp 流媒体服务器的配置和测试
2.1配置
Nginx的配置文件为: /etc/nginx/nginx.conf
Openresty 下的nginx配置文件为:/usr/local/openresty/nginx/conf/nginx.conf
- 在配置文件中加入如下内容:
rtmp {
server {
listen 1935;
application live {
live on;
}
}
}
配置文件里指定了rtmp的端口号和application名字,基于此配置项的rtmp地址为:
rtmp://IP:1935/live
- 重启nginx: systemctl restart nginx or systemctl restart openresty
- 然后运行sudo netstat -anp |grep nginx, 如果有如下输出 则流媒体 器配置成功。
$ sudo netstat -anp |grep nginx
tcp 0 0 0.0.0.0:1935 0.0.0.0:* LISTEN 12710/nginx: master
3. 后面就可以推流rtmp流到地址,假设IP地址为192.168.1.177,则nginx 的rtmp地址为:rtmp://192.168.1.177:1935/live
然后观看流媒体视频了。
2.2测试
使用视频文件和VLC测试服务器能否正常工作。
》首先使用Ffmpeg将视频文件转为rtmp流并推流到nginx服务器
ffmpeg -re -stream_loop -1 -fflags +genpts -i /local/jsmpeg-master/file.mp4 -vf crop=600:300:0:78 -q 0 -f flv -s 800x600 rtmp://192.168.1.177:1935/live
ffmpeg安装非常简单: $sudo apt-get install ffmpeg
》 VLC播放测试
使用VLC的播放网络串流功能,输入上面的流地址就可以播放了
如果能正常播放,则配置成功了。
2.3 Nginx实时监控+视频录制 配置
rtmp {
server {
listen 1935;
application live {
live on;
record all;
record_path /local/live_record;
record_max_size 128M;
}
}
}
Web 代码:
<html>
<head>
<title>Live</title>
<meta charset="utf-8">
<link href="http://vjs.zencdn.net/5.5.3/video-js.css" rel="stylesheet">
<!-- If you'd like to support IE8 -->
<script src="http://vjs.zencdn.net/ie8/1.1.1/videojs-ie8.min.js"></script>
<script src="http://vjs.zencdn.net/5.5.3/video.js"></script>
</head>
<body>
<video id="my-video" class="video-js" controls preload="auto" width="640" height="300"
poster="http://ppt.downhot.com/d/file/p/2014/08/12/9d92575b4962a981bd9af247ef142449.jpg" data-setup="{}">
<source src="rtmp://192.168.1.107:2018/live/" type="rtmp/flv">
</p>
</video>
</body>
</html>
参见
https://www.cnblogs.com/nssdeblog/p/10415678.html
nginx-rtmp-module指令详解
https://blog.csdn.net/defonds/article/details/9274479/
3 应用场景
3.1 4G/5G DTU视频模块+Nginx 实现云服务器web监控
如下所示, 监控摄像头的视频数据通过DTU模块转为RTMP视频流,DTU模块将此视频流推流到云服务器上的nginx流媒体模块。 用户通过浏览器访问web server,在页面中嵌入rtmp播放器播放流媒体服务器的视频流。
DTU模块只要有网络信号覆盖的区域都可以工作,此方案非常适合偏远无法布置网络或者移动巡检机器人等视频传输和监控。
3.2 Ffmpeg + Nginx 实现直播/点播
Ffmpeg可以将视频文件或者摄像头数据转为rtmp流。
文件转rtmp流:
ffmpeg -re -stream_loop -1 -fflags +genpts -i /local/jsmpeg-master/file.mp4 -vf crop=600:300:0:78 -q 0 -f flv -s 800x600 rtmp://192.168.1.177:1935/live
摄像头视频转rtmp流:
这里假设摄像头支持RTSP协议
ffmpeg -i "rtsp://admin:aaa@qq.com:554/h264/ch1/main/av_stream" -r 30 -f flv -s 800x600 rtmp:// 192.168.1.177:1935/live
4 Trouble shooting
4.1 Ffmpeg将MP4视频文件转为rtmp流媒体时,报错:
[flv @ 0x55d762930ee0] Failed to update header with correct duration.532.3kbits/s speed=0.998x
[flv @ 0x55d762930ee0] Failed to update header with correct filesize.
解决:
需要加上stream_loop参数,如下所示:
ffmpeg -re -stream_loop -1 -fflags +genpts -i /local/jsmpeg-master/file.mp4 -vf crop=600:300:0:78 -q 0 -f flv -s 800x600 rtmp://192.168.1.177:1935/live
4.2 延时大,视频不清楚
使用VLC测试摄像头数据时,视频会有20秒的延时,这是VLC的问题,并不是ffmpeg或者nginx的延时,客户可以使用网页测试,没这个问题。
测试发现,ffmpeg将视频文件转码为rtmp flv流时,有如下特点:
ffmpeg -re -stream_loop -1 -fflags +genpts -i /local/jsmpeg-master/file.mp4 -vf crop=600:300:0:78 -q 0 -f flv -s 800x600 rtmp://192.168.1.177:1935/live
带宽高,流畅
ffmpeg -re -stream_loop -1 -i /local/jsmpeg-master/file.mp4 -vcodec copy -acodec copy -b:v 800k -b:a 32k -f flv rtmp://192.168.1.177:1935/live
带宽低,不流畅
5 Reference:
https://www.cnblogs.com/nssdeblog/p/10415678.html
上一篇: C. Two Arrays(组合数学/动态规划) Educational Codeforces Round 80 (Rated for Div. 2)
下一篇: 复制本地数据库中的一个表到远程数据库
推荐阅读
-
流媒体服务器RTMP推流EasyDSS遇到easydss: [emerg] getpwnam(“nobody”) failed错误的的排查方案
-
集推流和流媒体RTSP服务于一身的同屏功能组件支持Windows,Android平台EasyScreenLive-Win同屏㢟开启屏幕采集失败解决方案
-
基于JavaCV技术实现RTMP推流和拉流功能
-
使用树莓派搭建Nginx-RTMP流媒体服务器实现ffmpeg推流
-
windows下ffmpeg结合Nginx搭建RTMP,直播中的推流和拉流
-
视频流媒体RTSP专用播放器RTSP拉流、RTMP推流方案之EasyPlayer-RTSP-Win抓图代码重构流程介绍
-
nginx + rtmp 搭建流媒体服务器,手机推流,vlc拉流
-
iOS开发之利用IJKPlayer+nginx+rtmp搭建直播的推流和拉流
-
基于Nginx实现RTMP流媒体的推流和拉流方案