以下是基于 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. 拉流转推测试
-
步骤:
-
在 Web 页面输入源流地址(如
rtmp://live.example.com/live/original_stream
)。 -
输入目标流名称(如
my_stream
)。 -
点击 "开始拉流",成功后会提示拉流成功。
-
查看流列表,确认新流已生成。
-
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
调整日志级别和路径。
总结
通过以上步骤,你已完成:
-
ZLMediaKit 的编译和部署。
-
基于 HTTP API 的拉流、转推功能。
-
简单的 Web 管理界面。
-
流的播放验证和公网访问。
关键验证点:
-
Web 页面能否成功调用 API 拉流。
-
生成的 HLS 和 HTTP-FLV 地址能否正常播放。
-
防火墙和公网端口是否配置正确。