基于 ZLMediaKit (ZLM) 从零开始搭建一个支持 Web 管理的拉流

以下是基于 ZLMediaKit (ZLM) 从零开始搭建一个支持 Web 管理的拉流、转推服务的完整步骤说明。整个过程包括环境准备、编译部署、配置、Web 界面开发及测试验证。


一、环境准备

1. 系统要求
  • 操作系统: CentOS 7(其他 Linux 发行版类似)

  • 网络: 服务器需有公网 IP(若需公网访问)

2. 安装依赖

安装编译 ZLMediaKit 所需的工具和库:

bash

复制

sudo yum install -y git gcc gcc-c++ cmake make openssl-devel

二、编译 ZLMediaKit

1. 克隆源码

bash

复制

git clone --depth 1 https://github.com/ZLMediaKit/ZLMediaKit.git
cd ZLMediaKit
git submodule update --init
2. 编译源码

bash

复制

mkdir build
cd build
cmake .. -DCMAKE_BUILD_TYPE=Release
make -j4  # 根据 CPU 核心数调整(如 -j2)

编译完成后,生成的二进制文件位于 release/linux/Release/ 目录。


三、配置 ZLMediaKit

1. 修改配置文件

进入编译后的目录,编辑 config.ini

bash

复制

cd release/linux/Release/
vi config.ini
2. 关键配置项

ini

复制

# 开启 HTTP API(用于 Web 管理)
[http]
port=80
root=./www  # Web 根目录

# RTMP 配置(用于推流/拉流)
[rtmp]
port=1935

# HLS 配置(生成 m3u8 文件)
[hls]
file_path=./hls  # HLS 切片存放路径

# API 密钥(默认密钥,建议修改)
[api]
secret=035c73f7-bb6b-4889-a715-d9eb2d1925cc

四、启动 ZLMediaKit

1. 启动服务

bash

复制

./MediaServer -d  # 后台运行
2. 验证服务
  • 检查端口监听状态:

    bash

    复制

    netstat -tunlp | grep -E '80|1935'
  • 访问 http://服务器IP/,若看到默认页面,表示服务已启动。


五、实现 Web 管理界面

1. 创建 Web 页面

在 ZLM 的 www 目录下创建 index.html

bash

复制

vi release/linux/Release/www/index.html

内容如下(一个简单的拉流控制台):

html

复制

<!DOCTYPE html>
<html>
<head>
    <title>ZLMediaKit 流管理</title>
    <style>
        body { font-family: Arial, sans-serif; padding: 20px; }
        .form-group { margin: 10px 0; }
        input { width: 300px; padding: 5px; }
        button { padding: 5px 15px; background: #28a745; color: white; border: none; cursor: pointer; }
        button:hover { background: #218838; }
        .stream-list { margin-top: 20px; }
    </style>
</head>
<body>
    <h1>拉流转推控制台</h1>
    
    <div class="form-group">
        <input type="text" id="sourceUrl" placeholder="输入源流地址(如 rtmp://example.com/live/stream)">
        <input type="text" id="targetKey" placeholder="输入目标流名称(如 my_stream)">
        <button onclick="startPull()">开始拉流</button>
    </div>

    <div class="stream-list" id="streamList"></div>

    <script>
        // 调用 ZLM API 拉流
        function startPull() {
            const sourceUrl = document.getElementById('sourceUrl').value;
            const targetKey = document.getElementById('targetKey').value;

            fetch('/index/api/addStreamProxy', {
                method: 'POST',
                headers: { 'Content-Type': 'application/x-www-form-urlencoded' },
                body: new URLSearchParams({
                    secret: '035c73f7-bb6b-4889-a715-d9eb2d1925cc', // 需与 config.ini 中的 secret 一致
                    vhost: '__defaultVhost__',
                    app: 'live',
                    stream: targetKey,
                    url: sourceUrl
                })
            })
            .then(response => response.json())
            .then(data => {
                if (data.code === 0) {
                    alert('拉流成功!');
                    updateStreamList();
                } else {
                    alert('拉流失败: ' + data.msg);
                }
            });
        }

        // 更新流列表
        function updateStreamList() {
            fetch('/index/api/getMediaList')
            .then(response => response.json())
            .then(data => {
                const listDiv = document.getElementById('streamList');
                listDiv.innerHTML = '<h2>活跃流列表</h2>';
                data.data.forEach(stream => {
                    listDiv.innerHTML += `
                        <div>
                            <strong>${stream.app}/${stream.stream}</strong> (${stream.schema})<br>
                            客户端数: ${stream.totalReaderCount}<br>
                            HLS地址: <a href="/hls/${stream.stream}.m3u8" target="_blank">/hls/${stream.stream}.m3u8</a>
                        </div><hr>
                    `;
                });
            });
        }

        // 每 5 秒刷新一次流列表
        setInterval(updateStreamList, 5000);
        updateStreamList(); // 初始加载
    </script>
</body>
</html>

运行 HTML


六、功能验证

1. 拉流转推测试
  • 步骤:

    1. 在 Web 页面输入源流地址(如 rtmp://live.example.com/live/original_stream)。

    2. 输入目标流名称(如 my_stream)。

    3. 点击 "开始拉流",成功后会提示拉流成功。

    4. 查看流列表,确认新流已生成。

2. 播放生成的流
  • HLS 播放地址:

    复制

    http://服务器IP/hls/my_stream.m3u8

    使用 VLC 或浏览器插件(如 HLS.js)播放。

  • HTTP-FLV 播放地址:

    复制

    http://服务器IP/live/my_stream.flv

    使用 flv.js 或支持 HTTP-FLV 的播放器。

3. 转推测试

若需要将流转推到其他平台(如 YouTube/Twitch):

bash

复制

# 使用 FFmpeg 将本地流转推到外部平台
ffmpeg -i http://服务器IP/live/my_stream.flv -c copy -f flv rtmp://youtube.com/xxx

七、防火墙与公网访问

1. 放行端口

bash

复制

sudo firewall-cmd --permanent --add-port=80/tcp   # HTTP
sudo firewall-cmd --permanent --add-port=1935/tcp # RTMP
sudo firewall-cmd --reload
2. 公网访问
  • 确保服务器有公网 IP。

  • 在路由器或云平台安全组中放行端口 80 和 1935


八、高级配置(可选)

1. 修改 API 密钥

编辑 config.ini,修改 [api] 段的 secret 值,并在 Web 页面的 JavaScript 中同步修改。

2. 启用 HTTPS
  • 在 config.ini 中配置 SSL 证书:

    ini

    复制

    [http]
    port=443
    ssl_port=443
    ssl_cert=./ssl/server.pem
    ssl_key=./ssl/server.key
3. 日志管理

日志文件默认位于 logs/ 目录,可通过 config.ini 调整日志级别和路径。


总结

通过以上步骤,你已完成:

  1. ZLMediaKit 的编译和部署。

  2. 基于 HTTP API 的拉流、转推功能。

  3. 简单的 Web 管理界面。

  4. 流的播放验证和公网访问。

关键验证点:

  • Web 页面能否成功调用 API 拉流。

  • 生成的 HLS 和 HTTP-FLV 地址能否正常播放。

  • 防火墙和公网端口是否配置正确。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值