Windows下通过nginx将摄像头RTSP视频流转为RTMP格式

简介

RTSP (Real-Time Stream Protocol)基于文本的多媒体播放控制协议。RTSP定义流格式,流数据经由RTP传输;RTSP实时效果非常好,适合视频聊天,视频监控等方向。

RTMP(Real Time Message Protocol) 用来解决多媒体数据传输流的多路复用(Multiplexing)和分包(packetizing)的问题,优势在于低延迟,稳定性高,支持所有摄像头格式,浏览器加载 flash插件就可以直接播放。

RTSP和RTMP的区别

RTSP虽然实时性最好,但是实现复杂,适合视频聊天和视频监控;RTMP强在浏览器支持好,加载flash插件后就能直接播放,所以非常火,相反在浏览器里播放rtsp就很困难了。

nginx-http-flv-module

nginx-http-flv-module是在nginx-rtmp-module基础上实现的一个音视频传输模块,将RTMP转为FLV封装格式,再通过HTTP协议下发。nginx-rtmp-module,是Nginx的一个优秀的第三方模块,可以用来直播,支持RTMP,HLS和DASH方式直播,还支持调用第三方软件进行转码,录制视频等功能,由于依托Nginx,性能也比较高。

nginx-http-flv-module的功能

  • nginx-rtmp-module 提供的所有功能。

  • nginx-http-flv-module 的其他功能与 nginx-rtmp-module的对比:

功能 nginx-http-flv-module nginx-rtmp-module 备注
HTTP-FLV (播放) x 支持 HTTPS-FLV 和 chunked 回复
GOP 缓存 x
虚拟主机 x
省略 listen 配置 见备注 配置中必须有一个 listen
纯音频支持 见备注 wait_videowait_key 开启后无法工作
reuseport 支持 x
定时打印访问记录 x
JSON 风格的 stat x
stat 中包含录制详情 x

安装

1、环境准备

nginx源码

https://github.com/nginx/nginx

MinGW

https://osdn.net/projects/mingw/releases/

安装后,配置环境变量
在这里插入图片描述
在这里插入图片描述

FFmpeg

https://www.gyan.dev/ffmpeg/builds/
在这里插入图片描述
解压后,配置环境变量
在这里插入图片描述

ActivePerl

https://www.activestate.com/products/perl/downloads/

安装后,配置环境变量
在这里插入图片描述

nasm

https://www.nasm.us/pub/nasm/releasebuilds/?C=M;O=D

安装后,配置环境变量
在这里插入图片描述

sed

https://sourceforge.net/projects/gnuwin32/files/sed/4.2.1/

安装后,配置环境变量
在这里插入图片描述

nginx-http-flv-module

https://github.com/winshining/nginx-http-flv-module

openssl

http://distfiles.macports.org/openssl/

zlib

https://www.zlib.net/

pcre

https://ftp.pcre.org/pub/pcre/

2、编译Nginx

新建文件夹nginx-flv并解压nginx源码到nginx-flv下,在nginx-flv下新建文件夹build,进入build,在build下新建文件夹3rdlib和output,将nginx-http-flv-module,openssl,zlib,pcre解压缩到nginx-flv/build/3rdlib目录下
在这里插入图片描述

在nginx-flv目录下新建build.bat文件并输入以下脚本

auto/configure --with-cc=cl --builddir=build/output --prefix= \
--conf-path=conf/nginx.conf --pid-path=logs/nginx.pid \
--http-log-path=logs/access.log --error-log-path=logs/error.log \
--sbin-path=nginx-flv.exe --http-client-body-temp-path=temp/client_body_temp \
--http-proxy-temp-path=temp/proxy_temp \
--http-fastcgi-temp-path=temp/fastcgi_temp \
--http-scgi-temp-path=temp/scgi_temp \
--http-uwsgi-temp-path=temp/uwsgi_temp \
--with-cc-opt=-DFD_SETSIZE=1024 --with-pcre=build/3rdlib/pcre-8.44 \
--with-zlib=build/3rdlib/zlib-1.2.11 --with-openssl=build/3rdlib/openssl-1.1.1i \
--with-select_module --with-http_ssl_module \
--add-module=build/3rdlib/nginx-http-flv-module-1.2.8

最终整个编译工程的目录构架如下

nginx-flv
├─auto
├─build
│ ├─3rdlib
│ │ ├─nginx-http-flv-module-master
│ │ ├─openssl-1.0.1u
│ │ ├─pcre-8.34
│ │ └─zlib-1.2.11
│ └─output
├─conf
├─contrib
├─docs
├─misc
├─src
└─build.bat

打开mingw命令行工具(C:\MinGW\msys\1.0\msys.bat)进入nginx-flv目录执行build.bat
在这里插入图片描述
在这里插入图片描述

以管理员身份打开VS2019工具命令提示符x86进入nginx-flv目录进行nmake
在这里插入图片描述
执行命令

nmake /f build/output/Makefile

在这里插入图片描述
在这里插入图片描述

编译完成后会在nginx-flv/build/output目录下生成nginx.exe
在这里插入图片描述

部署

  • 新建文件夹nginx-rtmp
  • 将生成的nginx.exe拷贝到nginx-rtmp目录下
  • 将nginx源码目录下的conf文件夹拷贝到nginx-rtmp目录下
  • 将nginx源码目录下的docs/html文件夹拷贝到nginx-rtmp目录下
  • 在nginx-rtmp目录下新建logs和temp文件夹
  • 将nginx-http-flv-module目录下的stat.xsl拷贝到nginx-rtmp/html目录下
    在这里插入图片描述

整个服务部署文件构架如下

nginx-rtmp
│ nginx.exe

├─conf
│ fastcgi.conf
│ fastcgi_params
│ koi-utf
│ koi-win
│ mime.types
│ nginx.conf
│ scgi_params
│ uwsgi_params
│ win-utf

├─html
│ 50x.html
│ index.html
│ stat.xsl

├─logs

└─temp

配置conf/nginx.conf文件

#user  nobody;
worker_processes  1;

#error_log  logs/error.log;
#error_log  logs/error.log  notice;
#error_log  logs/error.log  info;

#pid        logs/nginx.pid;

events {
    worker_connections  1024;
}

# 添加RTMP服务
rtmp {
    server {
        listen 1935; # 监听端口
 
        chunk_size 4000;
        application live {
            live on;
			gop_cache on;
        }
    }
}

http {
    include       mime.types;
    default_type  application/octet-stream;

    sendfile        on;
    #tcp_nopush     on;

    #keepalive_timeout  0;
    keepalive_timeout  65;

    #gzip  on;

    server {
        listen       8080;
        server_name  localhost;

        #charset koi8-r;

        #access_log  logs/host.access.log  main;

        location /stat.xsl {
            root html;
        }

		location /stat {
            rtmp_stat all;
            rtmp_stat_stylesheet stat.xsl;
        }

        location / {
            root   html;
            index  index.html index.htm;
        }
}

启动

进入nginx-rtmp目录下双击nginx.exe

查看任务进程是否存在

tasklist /fi "imagename eq nginx.exe

在这里插入图片描述
通过海康威视综合安防管理平台的API接口返回的RTSP流为:

rtsp://IP地址:554/openUrl/rby3v0s?beginTime=20201219T234629&endTime=20201220T001459&playBackMode=1&streamform=rtp

打开CMD,执行命令:

ffmpeg  -re -rtsp_transport tcp -i rtsp://IP地址:554/openUrl/rby3v0s?beginTime=20201219T234629&endTime=20201220T001459&playBackMode=1&streamform=rtp -f flv -vcodec libx264 -vprofile baseline -acodec aac -ar 44100 -strict -2 -ac 1 -f flv -s 800x600 -q 10 rtmp://localhost:1935/live/dsdhz

在命令提示符中,&前面需要添加^符号转义
在这里插入图片描述
VLC取流: rtmp://localhost:1935/live/dsdhz
在这里插入图片描述
http://localhost:8080/stat 可以查看nginx媒体流的状态
在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/miaodichiyou/article/details/111511272
今日推荐