同时在 Nginx 中启用 nginx-http-flv-module 和 nginx-rtmp-module

同时在 Nginx 中启用 nginx-http-flv-modulenginx-rtmp-module,这是完全可以实现的。以下是如何在 UbuntuDebian 上重新编译并配置 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-modulenginx-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-modulenginx-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 来支持 RTMPHTTP-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 已经配置好了 RTMPHTTP-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 服务器。你可以使用它来进行实时视频推流和播放。

如果有任何问题,欢迎随时向我提问!

作者: Mee

Mark Kwok

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注