背景:
公司产品有使用 nginx+ rtmp 的技术要求,本人在 arm、Ubuntu都配置过。为了配合同事开发,所以尝试在Windows搭建这样的生产环境。
注意:
虽然官网上有提供编译好的windows版本的nginx ,但凡需要添加删除模块的,都需要通过nginx源码进行编译。
Host :Windows-10,core-i7
编译之前的环境搭建
以下软件的安装,路径不要出现中文字符与空格
安装 MinGW
下载好MinGW以后,安装时勾选以下选项- mingw-devloper-toolkit
- mingw32-base
- mingw32-gcc-g++
- msys-base
安装完成以后按住Win+R 打开cmd,输入gcc 测试是否成功
安装 mercurial
mercurial用于下载 nginx-win版本的源码,安装没有任何其他需要注意的地方
安装完成以后按住Win+R 打开cmd,输入hg 测试是否成功
安装 strawberryperl
Strawberry Perl是Windows环境的一个Perl环境,它的目的是尽可能接近UNIX系统上的Perl环境,在编译nginx及其依赖库的时候需要用到。
安装 nasm
NASM全称The Netwide Assembler,是一款基于80x86和x86-64平台的汇编语言编译程序,其设计初衷是为了实现编译器程序跨平台和模块化的特性,在编译nginx的时候可能需要对编译脚本进行修改的时候会用到。
安装完成后,需要将其安装路径加入到PATH环境变量。下载有关的源码
nginx-win32-src 下载
在cmd中执行命令
hg clone http://hg.nginx.org/nginx nginx-win32-src
nginx 有关
其他环境依赖
-
下载nginx相关的源码包
搭建nginx-rtmp服务器需要下载nginx源码和nginx-rtmp-module源码。以及nginx依赖的组件。 后面将要在msys下进行配置,不像linux下直接可以使用yum install xxx-devel的形式安装依赖的组件包头。所以需要将nginx相关的源码包悉数下载好,注意是源码包,因为nginx编译时需要引用这些依赖库的开发标头。 -
linux下的nginx源码包可以直接去 nginx网站下载,但是上面的源码包只有linux的,源码的os文件夹下仅有unix平台的。而windows只有编译好的文件。这里就需要使用Mercurial下载带有win32平台的nginx源码包。在cmd中执行命令 hg clone http://hg.nginx.org/nginx nginx-win32-src 下载最新的nginx代码,耐心等待源码down到本地,也可以下载指定的版本,具体参考 hg help 。
-
作为nginx外接的扩展模块,将用作后面搭建RTMP直播环境的一部分使用Git或者SVN等工具或者直接去GitHub上下载nginx-rtmp-module
以下是我使用的几个源码包的版本:
编译nginx
-
将上述下载好的五个源码包拷贝到msys目录下 $MinGW安装目录\msys\1.0\home\$USERNAME\。
-
打开msys批处理文件,分别解压之前下载的源码包。
-
进入nginx源码目录。新建一个configuration-nginx.bat文件,里面内容如下,后面的将几个依赖包加入的配置代码根据实际情况填写不同路径。auto/configure --with-cc=cl --builddir=objs --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.exe --http-client-body-temp-path=temp/client_body_temp \--http-proxy-temp-path=temp/proxy_temp \--http-fastcgi-temp-path=temp/fastcgi_temp \--with-cc-opt=-DFD_SETSIZE=1024 \--with-select_module \--with-debug \--with-http_ssl_module \--with-pcre=../pcre-8.40 --with-zlib=../zlib-1.2.11 --with-openssl=../openssl-1.0.2l \--add-module=../nginx-rtmp-module-1.1.11
-
此时执行该批处理文件,稍稍等待几秒钟,会出现nginx配置完成的信息。这里会发现有一个异样的提示,auto/cc/msvc: line 117: [: : integer expression expected ,只要修改文件 $nginx源码目录\auto\cc\msvc 即可,
-
在 echo " + cl version: $NGX_MSVC_VER" 的前面加入一行 NGX_MSVC_VER=15.00 ,当然不修改也不会影响后续的编译。如果需要指定后续编译nginx时禁用优化,则将其中的 CFLAGS="$CFLAGS -O2"修改为 CFLAGS="$CFLAGS -Od" 。到这里为止,msys的使命就完成了。
-
-
打开Visual Studio 2008 命令提示,
输入:
cd /d nginx源码目录
nmake /f objs\MakeFile ,会发现编译报错。
此时,之前安装的NASM就该登场了。
打开文件 $nginx源码目录\auto\lib\openssl\makefile.msvc,将其中的
ms\do_ms
修改为
ms\do_nasm
然后,删除openssl源码目录中的out32和tmp32两个临时目录,重新启动Visual Studio 2008 命令提示,再次执行前面的第五步就可以了。
-
成功编译之后,最终会有以下打印信息,并且在nginx源码目录的objs目录中可以看到最终生成的nginx.exe文件。
nginx-rtmp环境搭建
-
可以在msys的根目录 / 下新建一个nginx目录,然后将生成的nginx.exe,nginx源码目录下的conf目录以及docs目录下的html目录都拷贝到当前目录,并手动新建logs和temp两个目录,形成最终的目录结构。
-
随后修改conf/nginx.conf,关于如何配置和修改不在本文范畴内,在当前nginx目录中,启动windows命令行,运行 start /b nginx.exe -c conf\nginx.conf 这样nginx服务就在后台启动了。在浏览器中输入地址进入到nginx服务的主页,如果可以看到如下内容,说明整个环境已经OK,接下来可以使用推流和拉流看看实际效果了。最后使用命令 nginx.exe -s stop 优雅地终止nginx服务。
效果测试
接下来的效果测试,对环境稍微做了一点点改动,使用nginx-rtmp-module中提供的JWPlayer的Play页面进行拉流或者Record页面进行推流。
-
首先是在nginx/html/目录下新建一个文件夹 nginx-rtmp-module,将之前解压的nginx-rtmp-module-1.1.11目录下的stat.xsl文件以及test文件夹拷贝到新建的目录nginx-rtmp-module下。
-
修改nginx/html/nginx-rtmp-module/test/nginx.conf文件,关闭nginx的守护和master-worker模式,由于本机有SVN占据了80端口,所以修改http的服务端口为8080,同时将nginx服务的访问目录修改为刚才nginx-rtmp-module中指向的index文件。再加入RTMP模块的配置,最终的配置文件内容如下:worker_processes 1;daemon off;master_process off;error_log logs/error.log info;events {worker_connections 1024;}rtmp {server {listen 1935;application live {live on;}}}http {server {listen 8080;location /stat {rtmp_stat all;rtmp_stat_stylesheet stat.xsl;}location /stat.xsl {root html/nginx-rtmp-module/;}location /control {rtmp_control all;}location /rtmp-publisher {root html/nginx-rtmp-module/test;}location / {root html/nginx-rtmp-module/test/www;}}}
-
配置拉流名字,修改nginx/html/nginx-rtmp-module/test/www/index.html文件,将file: "rtmp://localhost/myapp?carg=1/mystream?sarg=2" 修改为file: "rtmp://localhost/live?carg=1/test?sarg=2" 以保持和上面的配置文件一致。
-
配置推流名称,修改nginx/html/nginx-rtmp-module/test/www/record.html文件,将开始的'streamer': 'rtmp://localhost/myapp', 修改为'streamer': 'rtmp://localhost/live' 以保持和上面的配置文件一致。
-
在msys下进入nginx目录,执行 nginx.exe -c html/nginx-rtmp-module/test/nginx.conf & nginx服务会在后台运行。
-
推流,推流的手段有很多,此处使用ffmpeg将本地的文件流化并推到nginx服务。ffmpeg -re -i "F:\TDDownload\BBC记录片\BBC理查德哈蒙德:看不见的世界BD中字-cd1.mkv" -vcodec copy -f flv rtmp://192.168.100.2/live/test
-
拉流,拉流方式也很多,浏览器中打开nginx服务的主页面192.168.100.2:8080,可以看到出现的视频播放窗口,点击Play即可拉流,此时的流地址就是上面配置好的rtmp://192.168.100.2/live/test ,也可在 SRS播放器页面输入流地址rtmp://192.168.100.2/live/test 拉流,还可利用 ffplay rtmp://192.168.100.2/live/test 拉流。
-
打开nginx服务的统计页面192.168.100.2:8080/stat也可以看到当前的服务运行状态。
-
使用JWPlayer的Record页面采集摄像头和麦的数据推流到nginx服务,在 SRS播放器页面拉流,由于前面配置的Record页面推流的名字是mystream,所以此处输入 rtmp://192.168.100.2/live/mystream。
最后说明
本来还试着在移动端试试播放效果,不过JWPlayer貌似是不支持直接在html页面进行rtmp直播,不过可以下载一个app(易推流)进行rtmp的直播测试。
有关nginx-rtmp服务器的搭建过程到此就算全部完成了,在此过程中当然也不全是靠我自己的摸索,也参考了前辈或同行的经验,在此感谢那些曾经的贡献者,参考资料如下: