基于Nginx+nginx-rtmp-module实现 RTMP web流媒体方案
发布日期:2021-10-03 22:59:14 浏览次数:34 分类:技术文章

本文共 8240 字,大约阅读时间需要 27 分钟。

目录

 


   

  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

也可以到github网站,直接http下载zip

本文放在目录/local/nginx-rtmp-module

1.1.3 Nginx源码安装

从 选择你想要的版本,既然是全新安装,就选择最新稳定版本就好了,当前的最新稳定版本为1.18.0

下载:$ wget

$ 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.11.1.2节安装依赖包和下载nginx-rtmp-module

1.2.2 升级nginx

  1. 首先查看系统中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

configure arguments:

  1. 可知版本为1.14.0,到下载相应的源码包
  2. 编译新的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源码安装

到 下载最新版本的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

到 下载相应版本的Openresty源码包

 

  1. 解压:$tar -xzvf openresty-1.15.8.3.tar.gz
  2. 进入解压目录:cd openresty
  3. 运行configure: $ ./configure  --add-module=/local/nginx-rtmp-module

         /local/nginx-rtmp-module 为下载的nginx-rtmp-module源码所在的目录

  1. 编译: $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

  1. 在配置文件中加入如下内容:
rtmp {    server {    listen 1935;    application live {    live on;    }    }}

    

     配置文件里指定了rtmp的端口号和application名字,基于此配置项的rtmp地址为:

         rtmp://IP:1935/live

  1. 重启nginx: systemctl restart nginx or systemctl restart openresty
  2. 然后运行sudo netstat -anp |grep nginx, 如果有如下输出  则流媒体 器配置成功。
$ sudo netstat -anp |grep nginxtcp        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 代码:

    Live    
   
   
       

参见

nginx-rtmp-module指令详解

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:foa123456@192.168.10.211:554/h264/ch1/main/av_stream" -r 30 -f flv -s 800x600  rtmp:// 192.168.1.177:1935/live

4 Trouble shooting

4.1 FfmpegMP4视频文件转为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 延时大,视频不清楚

测试发现,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://blog.csdn.net/lclfans1983/article/details/105740982 如侵犯您的版权,请留言回复原文章的地址,我们会给您删除此文章,给您带来不便请您谅解!

上一篇:基于python的Modbus/MQTT/S7/OPCUA库总结
下一篇:mosquitto通配符订阅topic和桥接模式详解

发表评论

最新留言

做的很好,不错不错
[***.243.131.199]2024年03月23日 16时41分38秒

关于作者

    喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!

推荐文章

php局部页面滚动,在访问另一页面后保留浏览器滚动位置 - php 2019-04-21
jmeter运行linux命令行,Jmeter在linux上运行(命令行运行Jmeter) 2019-04-21
linux服务器怎么添加站点,如何增加站点或虚拟主机及文件说明 2019-04-21
linux系统输入指令,Linux系统基础 - 基本操作命令 2019-04-21
linux设备管理命令,Linux命令(设备管理).doc 2019-04-21
linux 中文utf-8转gbk编码,Linux平台下 GBK编码转UTF-8编码 2019-04-21
linux安装软件在boot,在Linux系统上安装Spring boot应用的教程详解 2019-04-21
linux进入用户user1主目录,Linux系统命令提示符为[user1@localhost root]当前用户所在目录为( )... 2019-04-21
取消linux自动登录,linuxdeepin 如何取消自动登录啊? 2019-04-21
linux线程存储,Linux系统编程手册:线程:线程安全和每线程存储 2019-04-21
linux以root账号登陆gnome,CentOS 7 - 以root身份登入Gnome 2019-04-21
linux crontab 备份数据库 空文件,Linux下使用crontab自动备份数据库 2019-04-21
linux批处理模式,巧用linux-top的批处理模式 2019-04-21
linux信号量机制例题,第二章 信号量机制及几个经典例题 2019-04-21
linux ba 模拟,在你的 Python 游戏中模拟引力 | Linux 中国 2019-04-21
c语言表达式3649的值是,535个C语言经典实例目录.doc 2019-04-21
c语言Wndproc未定义,小弟我用c语言写了一个windows窗口,为什么有提示未定义的变量类型... 2019-04-21
c语言中malloc数组,如何在C中对malloc()数组进行一行赋值? 2019-04-21
c语言调存储过程,写留言板–调用存储过程出问题 2019-04-21
c语言编程max,C语言编程题及答案.doc 2019-04-21