Node-Media-Server搭建家用安防流媒体服务摄像头离线、FFmpeg异常问题求助
问题原因
1. 摄像头偶尔不显示在流面板
- 你使用的静态RTSP拉流配置默认没有自动重连机制,树莓派Zero W的WiFi本身稳定性较差,一旦出现网络波动断流,NMS不会主动重新拉取摄像头的RTSP流,导致流从面板消失。
- 你自定义的每小时切片逻辑中,kill转码FFmpeg进程时未同步通知NMS重置拉流会话,加上树莓派A+性能有限,4路流同时处理时CPU占用过高,容易导致拉流会话超时被销毁。
- 日志中出现的
cron.hourly定时任务执行时会占用系统资源,进一步加剧性能不足导致的会话断连问题。
2. FFmpeg进程残留、仅能播放前2-3秒
- 你修改的
node_trans_session.js中,第一个FFmpeg进程的close回调里注释了this.emit('end'),导致FFmpeg退出后NMS不知道会话已经结束,面板依然显示流存在,但实际流已经中断,仅能播放缓存的GOP前几秒内容。 - 你自定义的切片逻辑中kill FFmpeg时仅使用默认的
SIGTERM信号,FFmpeg卡住时无法正常退出,会变成僵尸进程占用流资源,新启动的FFmpeg无法正常推流,导致播放失败。 - 20秒一次的整点轮询逻辑存在重复触发的问题,同一整点可能多次执行kill操作,导致FFmpeg进程冲突残留。
解决方案
针对摄像头不显示问题
- 修改
app.js中的relay配置,给每个拉流任务增加自动重连参数:
tasks: [ { app: 'live', mode: 'static', edge: 'rtsp://11.11.11.2:8554/live', name: 'cam1', rtsp_transport : 'tcp', retry_delay: 3000, retry_max: 0 // 0代表无限重试 }, // 其他3个摄像头配置同步增加上述两个参数 ]
- 给所有树莓派Zero W关闭WiFi省电模式,在
/etc/rc.local中新增一行iw dev wlan0 set power_save off后重启,降低WiFi断连概率。 - 降低摄像头推流的码率和分辨率,建议改成720P 15帧、码率512Kbps以内,减少树莓派A+的CPU占用。
针对FFmpeg残留播放卡顿问题
- 恢复
node_trans_session.js中第一个FFmpegclose回调里的this.emit('end')代码,确保FFmpeg退出后NMS能同步销毁旧会话。 - 修改所有kill FFmpeg的逻辑,优先发
SIGINT信号,超时未退出再发强杀信号,避免僵尸进程:
// 替换原来的this.ffmpeg_exec.kill() this.ffmpeg_exec.kill('SIGINT'); setTimeout(() => { if(this.ffmpeg_exec && !this.ffmpeg_exec.killed) { this.ffmpeg_exec.kill('SIGKILL'); } }, 1000);
- 优化整点切片的轮询逻辑,增加时间戳判断避免重复触发,同时把轮询间隔改成1秒:
// 在constructor中新增变量 this.lastCutTime = 0; // 轮询逻辑中增加判断 const now = Date.now(); if (new Date().getMinutes() === 0 && new Date().getHours() % 12 !== 0) { if (now - this.lastCutTime < 3600000) return; this.lastCutTime = now; // 原有切片逻辑 }
- 建议把Node版本降级到14.x LTS版本,Node-Media-Server对Node 16的兼容性较差,容易出现异步会话处理异常。
内容的提问来源于stack exchange,提问作者Android'e Doğru
相关产品推荐
相关产品推荐

