如何将摄像头推流至自有服务器并转发至多台RTMP服务器
多RTMP服务器流转发的几种实现方案(含Node.js选项)
一、Node.js轻量流媒体库方案:Node-Media-Server
这是Node.js生态里专门做RTMP/HTTP-FLV/HLS的流媒体服务器,天生支持多目标转发,配置简单,适合快速集成到现有Node.js服务中。
实现步骤:
- 安装依赖:
npm install node-media-server
- 编写转发配置代码:
const NodeMediaServer = require('node-media-server'); const config = { rtmp: { port: 1935, chunk_size: 60000, gop_cache: true, ping: 30, ping_timeout: 60 }, relay: { ffmpeg: '/usr/bin/ffmpeg', // 需确保服务器已安装FFmpeg tasks: [ { app: 'live', mode: 'push', edge: 'rtmp://facebook.com/live/your-facebook-stream-key', }, { app: 'live', mode: 'push', edge: 'rtmp://another-server.com/live/stream-key', } ] } }; const nms = new NodeMediaServer(config); nms.run();
- 摄像头推流到你的服务器
rtmp://your-server-ip/live/stream-name,服务器会自动把流转发到配置里的多个RTMP目标。
适合场景:已有Node.js技术栈,需要快速搭建,并发量中等的场景。
二、Node.js封装FFmpeg命令行方案
FFmpeg是处理音视频的工业级工具,用Node.js调用FFmpeg子进程实现流转发,灵活性极高,支持编码格式转换、分辨率调整等额外处理。
实现步骤:
- 服务器先安装FFmpeg(根据系统用apt/yum/brew安装)
- Node.js代码示例:
const { spawn } = require('child_process'); // 输入流地址(摄像头推到你的服务器的地址) const inputStream = 'rtmp://your-server-ip/live/stream-name'; // 多个转发目标 const outputStreams = [ 'rtmp://facebook.com/live/your-facebook-stream-key', 'rtmp://another-server.com/live/stream-key' ]; // 构造FFmpeg命令参数 const args = [ '-i', inputStream, '-c:v', 'copy', // 直接复制视频流,不重新编码,节省资源 '-c:a', 'copy', // 直接复制音频流 '-f', 'tee', // 用tee协议实现多输出 outputStreams.map(url => `[f=flv]${url}`).join('|') ]; // 启动FFmpeg进程 const ffmpegProcess = spawn('ffmpeg', args); // 监听进程输出,用于调试和错误处理 ffmpegProcess.stdout.on('data', (data) => { console.log(`FFmpeg stdout: ${data}`); }); ffmpegProcess.stderr.on('data', (data) => { console.error(`FFmpeg stderr: ${data}`); }); ffmpegProcess.on('close', (code) => { console.log(`FFmpeg进程退出,代码: ${code}`); });
适合场景:需要对流转码、滤镜处理,或者转发目标协议不统一的场景;缺点是需要管理FFmpeg进程的生命周期,避免僵尸进程。
三、轻量SFU方案:MediaSoup转推配置
如果你已经了解SFU,MediaSoup可以作为高性能的流转发网关,支持将输入的RTMP流转推到多个RTMP端点,同时还支持WebRTC等其他协议,适合大规模并发场景。
核心思路:
- 配置MediaSoup的
RtpObserver监听输入的RTMP流(需要先将RTMP转成RTP流,MediaSoup有对应的处理模块) - 创建多个
Producer将流推送到不同的RTMP服务器(需要用FFmpeg或MediaSoup的扩展模块完成RTP到RTMP的转换)
适合场景:需要支持多协议(RTMP/WebRTC/HLS)、高并发直播,未来可能扩展更多功能的生产环境。
四、Nginx RTMP模块方案
Nginx加上RTMP模块是生产环境中性能极高的流媒体网关,资源占用低,稳定性强,适合大流量场景。
配置示例:
在Nginx配置文件中添加RTMP区块:
rtmp { server { listen 1935; chunk_size 4096; application live { live on; # 转发到多个RTMP目标 push rtmp://facebook.com/live/your-facebook-stream-key; push rtmp://another-server.com/live/stream-key; } } }
重启Nginx后,摄像头推流到rtmp://your-nginx-ip/live/stream-name,Nginx会自动转发到配置的目标。
适合场景:纯流媒体转发,高并发、低延迟要求的生产环境;如果需要动态调整转发目标,可以用Nginx Lua脚本扩展。
内容的提问来源于stack exchange,提问作者david correa
相关产品推荐
相关产品推荐

