欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

基于Nginx实现RTMP流媒体的推流和拉流方案

程序员文章站 2022-03-12 17:11:16
...

目录

1 Nginx 安装nginx-rtmp-module插件

1.1全新安装

1.1.1安装nginx依赖包

1.1.2下载nginx-rtmp-module源码

1.1.3 Nginx源码安装

1.2 升级安装

1.2.1安装依赖和下载nginx-rtmp-modul

1.2.2 升级nginx

 

1.3 基于openresty全新安装

1.3.1 安装依赖

1.3.2下载nginx-rtmp-module

1.3.3 Openresty源码安装

1.4 基于openresty升级安装

 1.4.1安装依赖和下载nginx-rtmp-module源码

1.4.2升级openresty

2 nginx rmtp 流媒体服务器的配置和测试

2.1配置

2.2测试

2.3 Nginx实时监控+视频录制 配置

3 应用场景

3.1 4G/5G DTU视频模块+Nginx 实现云服务器web监控

3.2 Ffmpeg + Nginx 实现直播/点播

文件转rtmp流:

摄像头视频转rtmp流:

4 Trouble shooting

4.1 Ffmpeg将MP4视频文件转为rtmp流媒体时,报错:

4.2 延时大,视频不清楚

5 Reference:


   

  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下载ziphttps://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.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: --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

  1. 可知版本为1.14.0,到http://nginx.org/en/download.html下载相应的源码包
  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源码安装

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源码包

 

  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 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的播放网络串流功能,输入上面的流地址就可以播放了

基于Nginx实现RTMP流媒体的推流和拉流方案

如果能正常播放,则配置成功了。

 

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播放器播放流媒体服务器的视频流。

基于Nginx实现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 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 延时大,视频不清楚

使用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

https://blog.csdn.net/bvngh3247/article/details/80405423

https://www.cnblogs.com/nssdeblog/p/10415678.html