同时在 Nginx 中启用 nginx-http-flv-module 和 nginx-rtmp-module,这是完全可以实现的。以下是如何在 Ubuntu 或 Debian 上重新编译并配置 Nginx,支持这两个模块的方法。
🛠️ 步骤 1:准备编译环境
首先,确保你已经安装了编译所需的依赖包。
sudo apt update
sudo apt install -y build-essential libpcre3 libpcre3-dev libssl-dev zlib1g-dev git
🛠️ 步骤 2:下载并解压 Nginx 和所需的模块
接下来,我们将下载 Nginx 的源代码以及需要的两个模块(nginx-http-flv-module 和 nginx-rtmp-module)。
cd /usr/local/src
# 下载 Nginx 最新版源代码
wget http://nginx.org/download/nginx-1.24.0.tar.gz
tar -xzvf nginx-1.24.0.tar.gz
# 下载 nginx-rtmp-module
git clone https://github.com/arut/nginx-rtmp-module.git
# 下载 nginx-http-flv-module
git clone https://github.com/winshining/nginx-http-flv-module.git
🛠️ 步骤 3:编译并安装 Nginx
注意:
这里修改
// Include RTMP headers
#include <ngx_rtmp.h>
// Define missing NALU constants (if not already defined)
#define NGX_RTMP_NALU_SLICE 1 // NALU type for Slice
#define NGX_RTMP_NALU_IDR 5 // NALU type for IDR frame
#define NGX_RTMP_NALU_SEI 6
#define NGX_RTMP_NALU_SPS 7 // NALU type for Sequence Parameter Set
#define NGX_RTMP_NALU_PPS 8 // NALU type for Picture Parameter Set
#define NGX_RTMP_NALU_AUD 9
// Define missing constants if not already defined
#define NGX_RTMP_FRAME_IDR 5 // IDR frame type (commonly 5 in H.264)
#define NGX_RTMP_FRAME_I 1 // I-frame type
#define NGX_RTMP_FRAME_P 2 // P-frame type
#define NGX_RTMP_FRAME_B 3 // B-frame type
// 注释掉问题行
// len = ngx_rtmp_n3_to_h4((u_char *) &rlen);
// 或者替换为
len = sizeof(rlen);
在 Nginx 源码目录下,执行以下命令来编译 Nginx,并确保同时加载这两个模块。
bash复制cd nginx-1.24.0
# 配置 Nginx,添加两个模块(nginx-rtmp-module 和 nginx-http-flv-module)
./configure --add-module=../nginx-rtmp-module --add-module=../nginx-http-flv-module --with-http_ssl_module
# 编译并安装 Nginx
make -j$(nproc)
sudo make install
这一步会编译 Nginx,确保它加载了这两个模块:nginx-rtmp-module 和 nginx-http-flv-module,并安装到 /usr/local/nginx/。
🛠️ 步骤 4:验证安装
安装完成后,你可以通过以下命令检查 Nginx 是否成功加载了这两个模块。
# 检查 Nginx 配置参数
sudo /usr/local/nginx/sbin/nginx -V
输出中应该包含类似下面的信息:
bash复制--add-module=../nginx-rtmp-module
--add-module=../nginx-http-flv-module
如果有显示这两个模块,说明 Nginx 编译成功并加载了这两个模块。
🛠️ 步骤 5:配置 Nginx
现在,你可以配置 nginx.conf 来支持 RTMP 和 HTTP-FLV。
以下是一个配置示例,nginx.conf 中同时配置了 RTMP 和 HTTP-FLV:
nginx复制worker_processes auto;
events {
worker_connections 1024;
}
http {
include mime.types;
default_type application/octet-stream;
sendfile on;
keepalive_timeout 65;
server {
listen 8080; # HTTP-FLV 的端口
server_name localhost;
# 主页,测试页面
location / {
root html;
index index.html;
}
# HTTP-FLV 实时流
location /live {
flv_live on; # 开启 FLV 直播流
chunked_transfer_encoding on;
add_header 'Access-Control-Allow-Origin' '*';
add_header 'Access-Control-Allow-Credentials' 'true';
add_header Cache-Control no-cache;
}
# HLS 支持(可选)
location /hls {
types {
application/vnd.apple.mpegurl m3u8;
video/mp2t ts;
}
root /tmp; # 存放 HLS 切片的路径
add_header Cache-Control no-cache;
add_header 'Access-Control-Allow-Origin' '*';
add_header 'Access-Control-Allow-Credentials' 'true';
}
}
}
rtmp {
server {
listen 1935; # RTMP 推流端口
chunk_size 4096;
application live {
live on; # 开启 RTMP 直播流
record off; # 不记录流
hls on; # 开启 HLS 流支持(可选)
hls_path /tmp/hls; # 存储 HLS 文件的路径
hls_fragment 2s; # HLS 片段时长
}
}
}
🛠️ 步骤 6:启动 Nginx
配置好后,你可以启动 Nginx:
bash复制# 测试配置文件是否正确
sudo /usr/local/nginx/sbin/nginx -t
# 重新加载 Nginx 配置
sudo /usr/local/nginx/sbin/nginx -s reload
# 启动 Nginx 服务
sudo /usr/local/nginx/sbin/nginx
如果配置文件正确,Nginx 将会重新加载并开始服务。
🛠️ 步骤 7:推流与播放
现在,Nginx 已经配置好了 RTMP 和 HTTP-FLV。你可以开始推流并在浏览器中播放。
1. 推流(使用 ffmpeg)
你可以使用 ffmpeg 来推送视频流到 Nginx 的 RTMP 服务器:
bash复制ffmpeg -f v4l2 -framerate 30 -video_size 640x480 -i /dev/video0 \
-vf "scale=1280:720" -c:v libx264 -preset veryfast -tune zerolatency \
-f flv rtmp://localhost/live/stream
2. 播放 RTMP 流
- 使用 VLC 播放 RTMP 流: arduino复制
rtmp://localhost/live/stream
3. 播放 HTTP-FLV 流
- 在浏览器中播放 HTTP-FLV: bash复制
http://localhost:8080/live/stream.flv
🛠️ 步骤 8:检查并调试
如果你在启动或推流过程中遇到问题,可以查看 Nginx 错误日志来排查问题:
bash复制sudo tail -f /usr/local/nginx/logs/error.log
这将帮助你查看详细的错误信息,以便你做进一步的调试。
🚀 小结
通过以上步骤,你成功编译了一个 支持 RTMP 和 HTTP-FLV 的 Nginx 服务器。你可以使用它来进行实时视频推流和播放。
如果有任何问题,欢迎随时向我提问!