编译nginx-rtmp实现拉流和推流

Shi Yi2025/08/22toolnginxgccrtmp

背景

最近有个外包项目需要用到直播流,需要用nginx源码编译入rtmp模块,在GitHub也找了找编译好的产物,确实有,地址是https://github.com/illuspas/nginx-rtmp-win32open in new window看了一下时间,8年前编译的,我嫌弃太旧了,那我直接重新编译一个吧。

至于我为什么找的是Windows,因为我是个失败的开发者,至今没有Mac,或者是Linux的物理机,为什么不用虚拟机?我觉得麻烦

TIP

RTMP(实时消息传输协议)是一种基于TCP的数据传输协议,最初由Adobe公司为Flash Player开发。它主要用于音视频流的实时传输,支持音频、视频和数据的交互。RTMP协议的工作原理包括握手、建立网络连接和流媒体播放过程,能够保证实时性和数据传输的稳定性。RTMP在直播和流媒体应用中被广泛使用,尤其是在需要低延迟的场景中。

编译

  1. 下载nginx源码,我下载的版本是1.28.0,在我目前的这个日期,应该是比较新的,地址:https://nginx.org/en/download.htmlopen in new window

  2. 下载nginx-rtmp-module源码,我下载的版本是1.2.2(其实是用的仓库最新的源码),地址:https://github.com/arut/nginx-rtmp-moduleopen in new window

  3. 下载pcre源码,我下载的版本是8.45,地址:https://sourceforge.net/projects/pcre/open in new window

INFO

PCRE(Perl Compatible Regular Expressions)是一个与 Perl 语言兼容的正则表达式库。它提供了一套函数,用于实现基于模式的字符串匹配,功能强大且性能优越。nginx本身的URL匹配功能强依赖PCRE,因此需要安装PCRE。当然这个你可以在包管理器直接下载,或者下载单独的包进行指定编译。

  1. 下载openssl源码,地址:https://github.com/openssl/opensslopen in new window

  2. 下载zlib源码,地址:https://github.com/madler/zlibopen in new window

  3. 打开MSYS2,进入到nginx文件夹,执行以下命令

./configure --with-openssl=你的openssl源码的位置,后面依次类推 --with-zlib=../zlib --with-pcre=../pcre --with-http_ssl_module  --prefix=../nginx-release --add-module=../nginx-rtmp-module

WARNING

这里不叙述怎么安装MSYS2,按道理大家都已经安装MSYS2了,这个工具是比较实用的

  1. 你可能会遇见一些报错 比如
In file included from ../nginx-rtmp-module-master/ngx_rtmp.c:11:
../nginx-rtmp-module-master/ngx_rtmp.h:22:29: error: conflicting types for 'int8_t'; have 'char'
22 | typedef __int8              int8_t;
|                             ^~~~~~
In file included from C:/msys64/ucrt64/lib/gcc/x86_64-w64-mingw32/15.1.0/include/stdint.h:11,
from src/os/win32/ngx_win32_config.h:62,
from src/core/ngx_config.h:38,
from ../nginx-rtmp-module-master/ngx_rtmp.c:7:

这个意思是类型被重定义了,这个类型已经被官方库定义了,然后源码又定义了,所以发生了冲突,我们找到源码的位置

#if (NGX_WIN32)
typedef __int8              int8_t;
typedef unsigned __int8     uint8_t;
#endif

很显然这是一个条件编译,可能老的gcc并没有默认这些定义,在新版添加的,我不怎么会gcc,这里可能说错了,我们直接注释

你可能还会遇到这种错误

../nginx-rtmp-module-master/ngx_rtmp.h:186: error: ignoring '#pragma warning ' [-Werror=unknown-pragmas]
186 | #pragma warning(push)
../nginx-rtmp-module-master/ngx_rtmp.h:187: error: ignoring '#pragma warning ' [-Werror=unknown-pragmas]
187 | #pragma warning(disable:4200)
../nginx-rtmp-module-master/ngx_rtmp.h:275: error: ignoring '#pragma warning ' [-Werror=unknown-pragmas]
275 | #pragma warning(pop)
cc1.exe: all warnings being treated as errors

这是源码手动抛出的提示,提示nginx的编译配置,当然这都是条件编译,只有在windows才会出现,根据提示找到源码直接注释

TIP

nginx编译中是默认警告当错误处理的,所以一遇见提示就会Error,然后中止了编译配置,我们可以找到nginx文件夹下的objs/Makefile,找到一行类似CFLAGS = -pipe -O -W -Wall -Wpointer-arith -Wno-unused-parameter -Werror -g ,我们尝试把-Werror去除,再进行也是可行的

  1. 经过几个功夫,也是成功完成了编译配置,接下来直接makemake install

  2. 接下来在../nginx-release会发现自己的编译产物,打开sbin文件夹,然后把nginx重命名为nginx.exe。整个过程也就结束了,其实也就一个非常简单的过程,也是一个非常常见的过程

仓库地址:https://github.com/ShiYioo/nginx-rtmp-winopen in new window ,目前已经做了推流和拉流的测试,是没有问题的。

Last Updated 10/15/2025, 3:11:45 PM
ON THIS PAGE