自已动手搭建一个免费视频监控手机看家监控系统
IP摄像机设备+云服务器+手机VLC拉流 从零部署完整手册(含开机自启+全踩坑避坑方案)
文章目录
一、整体网络架构
本次拉流方案基于【IP摄像机设备(BusyBox固件)+云端ZLMediaKit转发+手机VLC播放】架构,通过nc双向隧道+端口桥接实现内网设备公网推流、跨设备拉流,完整架构如下:
A (IP摄像机 固件 BusyBox, 内网/4G) D (云端服务器 182.61.46.206) E (手机 VLC)
RTSP Server :554 ZLMediaKit :554 + :80 rtsp://182.61.46.206:554
│ socat 9000↔8554 /live/IP摄像机
│ nc 反向隧道 frps :1554 (可选)
└────────── TCP 9000 ──────┘
核心流程:IP摄像机开机启动RTSP推流→搭建设备与云服务器双向隧道→云服务器端口桥接→调用媒体代理API转发流→手机VLC公网拉流播放
二、前置说明
所有操作分为三大模块:A端(IP摄像机设备)、D端(云服务器)、E端(手机VLC播放端),严格遵循「先设备推流、再服务器搭建、最后拉流测试」顺序,全程附踩坑问题、原因及解决方案。
三、A端(IP摄像机 BusyBox设备)完整操作
3.1 核心前置:开机启动RTSP推流服务(必做第一步)
设备开机后,必须优先启动RTSP推流脚本,否则后续隧道、拉流全部失效,为固定标准化操作,统一使用开机启动脚本执行。
执行命令
# 进入设备配置目录,执行开机RTSP推流启动脚本
cd /etc/config
./rtsp_start_zl.sh
脚本执行预期效果
脚本运行后,设备自动启动内置RTSP服务,监听本地554端口,完成视频流本地推流,为后续云端隧道转发提供数据流来源。
⚠️ 踩坑 #0:开机未执行脚本/脚本执行失败
-
故障现象:后续搭建隧道后无数据流、VLC黑屏、本地554端口未监听
-
根因:设备重启后RTSP服务不会自启,未手动执行脚本则无视频流输出;脚本权限不足、路径错误会执行失败
-
解决方案:
-
设备每次开机后,优先进入
/etc/config目录执行推流脚本,再做后续隧道操作 -
若脚本无法执行,添加执行权限:
chmod +x /etc/config/rtsp_start_zl.sh -
执行后校验端口:
netstat -tlnp | grep 554,预期返回tcp 0 0 0.0.0.0:554 LISTEN
-
3.2 设备网络预校验(脚本执行后必做)
确认推流服务正常后,校验设备网络连通性,避免隧道搭建失败
# 1. 校验本地RTSP端口监听状态
netstat -tlnp | grep 554
# 2. 校验与云服务器网络连通
ping -c 2 182.61.46.206
# 3. 校验云服务器9000端口可达性
nc 182.61.46.206 9000 &
sleep 3
kill %1 2>/dev/null
3.3 搭建NC双向反向隧道(核心转发通道)
完整执行命令(标准化流程)
# 1. 清理历史残留进程与管道文件(必清)
killall nc 2>/dev/null
rm -f /tmp/tunnel
# 2. 新建双向管道文件
mkfifo /tmp/tunnel
# 3. 启动NC双向隧道,桥接本地RTSP流与云端端口
nc 127.0.0.1 554 < /tmp/tunnel | nc 182.61.46.206 9000 > /tmp/tunnel &
# 4. 校验隧道进程存活
sleep 2
ps | grep nc | grep -v grep
⚠️ A端全量踩坑避坑指南(10大高频问题)
-
踩坑#1:FIFO管道文件不存在
-
现象:NC进程秒退,ps查询无进程
-
原因:未执行mkfifo创建管道,系统找不到/tmp/tunnel文件
-
解决:每次重启隧道必须先rm清理残留,再mkfifo新建
-
-
踩坑#2:BusyBox NC进程被TTY挂起
-
现象:NC进程状态为Stopped(tty input),隧道中断
-
原因:BusyBox原生NC后台运行易被终端输入挂起
-
解决:出现挂起时,执行
kill %1终止进程,改用setsid nc ...&脱离终端后台运行
-
-
踩坑#3:NC参数不兼容报错
-
现象:输入-v、-z参数提示invalid option
-
原因:该设备BusyBox精简编译,不支持扫描、冗余输出参数
-
解决:全程不使用-v、-z、-e参数,仅用原生NC基础语法
-
-
踩坑#4:NC -e参数转发失效
-
现象:使用-e参数双向转发无数据流
-
原因:BusyBox NC的-e参数存在原生BUG,无法解析带空格的转发命令
-
解决:放弃-e参数,固定使用【FIFO管道+双NC】桥接方案
-
-
踩坑#5:/dev/tcp路径不存在
-
现象:调用/dev/tcp转发提示目录不存在
-
原因:设备固件未编译/dev/tcp模块,不支持该转发方式
-
解决:仅使用FIFO管道NC隧道,摒弃所有/dev/tcp方案
-
-
踩坑#6:FRPC客户端无法运行
-
现象:下载ARM版frpc后无法启动、内存溢出
-
原因:Go编译的frpc体积大,设备RAM仅30MB,资源不足
-
解决:全程不用frp穿透,固定使用NC隧道方案
-
-
踩坑#7:重复启动隧道冲突
-
现象:重启隧道后无数据流
-
原因:历史NC进程残留,占用端口资源
-
解决:启动新隧道前必须执行killall nc清理残留进程
-
-
踩坑#8:RTSP脚本执行成功但无流
-
现象:554端口监听正常,但VLC拉流黑屏
-
原因:设备摄像头未启动、视频编码不匹配
-
解决:查看设备日志
cat /tmp/rtsp.log,排查摄像头与编码问题
-
-
踩坑#9:4G/内网网络波动
-
现象:隧道频繁断开、拉流卡顿
-
解决:重新ping云端校验网络,重启隧道服务
-
-
踩坑#10:目录路径错误
-
现象:找不到rtsp_start_zl.sh脚本
-
解决:固定进入
/etc/config目录执行脚本,勿切换路径
-
四、D端(云服务器)完整操作
4.1 第一步:全局端口与进程清理(必做)
服务器残留僵尸进程会占用核心端口,导致启动失败,每次部署/重连必须先清理
# 强杀残留进程
pkill -9 -f socat
pkill -9 -f MediaServer
# 等待端口释放
sleep 2
# 校验核心端口是否清空
netstat -tlnp | grep -E '554|9000|8554'
预期:无任何端口监听输出,即为清理成功
⚠️ 踩坑#11:Socat僵尸进程占用端口
-
现象:启动socat提示Address already in use
-
原因:普通kill无法杀死socat子进程,端口不会自动释放
-
解决:必须使用
pkill -9强制查杀,彻底释放9000、8554端口
4.2 第二步:启动ZLMediaKit媒体服务
# 进入服务目录,启动媒体转发服务
cd /home/ZLMediaKit/release/linux/Debug
./MediaServer &
sleep 2
# 校验服务端口
netstat -tlnp | grep -E '554|1935|80'
⚠️ 踩坑#12:重复启动MediaServer报错
-
现象:提示554端口已被占用,服务启动失败
-
原因:服务器已有MediaServer实例在后台运行
-
解决:无需重启,执行
ps aux | grep MediaServer确认进程存活即可,原有服务可正常工作
4.3 第三步:启动Socat端口桥接转发
# 启动双向端口监听桥接
socat TCP-LISTEN:9000,reuseaddr,fork TCP-LISTEN:8554,reuseaddr,fork &
sleep 1
# 校验端口监听
netstat -tlnp | grep -E '9000|8554'
⚠️ 踩坑#13:8554端口不显示监听
-
现象:启动后仅9000端口监听,8554端口无输出
-
原理:socat双监听机制,先绑定9000等待设备连接,设备隧道接入后,才会fork子进程绑定8554端口
-
解决:属于正常现象,无需处理,等待A端隧道连接即可
4.4 第四步:调用API添加流代理(隧道建立后必做)
关键前提:必须等待A端NC隧道搭建完成、进程正常存活后,再执行API调用,否则拉流失效
# 定义服务密钥
SECRET="h3EGcm4mLb33P1wX4Ms3NDxUxTIGtM9G"
# 编码后调用代理API
curl "http://127.0.0.1:80/index/api/addStreamProxy?secret=$SECRET&vhost=__defaultVhost__&app=live&stream=IP摄像机&url=rtsp%3A%2F%2F127.0.0.1%3A8554%2Fvs0&rtsp_type=0"
⚠️ 踩坑#14:API报错URL拼写错误(对应系统报错)
-
现象:调用API提示【URL拼写可能存在错误,请检查】
-
根因:原始RTSP链接未做URL编码,直接明文传输导致接口解析失败
-
解决:必须将
rtsp://127.0.0.1:8554/vs0编码为rtsp%3A%2F%2F127.0.0.1%3A8554%2Fvs0,禁止使用原始URL
⚠️ 踩坑#15:密钥错误导致API调用失败
-
现象:API无返回、代理添加失败
-
解决:核对ZLMediaKit配置文件,确保SECRET密钥与实际一致
五、E端(手机VLC)拉流播放
标准操作步骤
-
打开手机VLC播放器,点击【网络】-【打开网络串流】
-
输入公网拉流地址:
rtsp://182.61.46.206:554/live/IP摄像机 -
点击播放,等待1-3秒加载视频流
⚠️ 踩坑#16:VLC连接失败/黑屏
-
连接失败:检查云端API是否调用成功、554端口防火墙是否放行
-
连接成功黑屏:检查A端RTSP推流是否正常、摄像头是否工作、视频编码适配性
六、全流程快速故障排查对照表
| 故障现象 | 核心原因 | 排查/解决命令 |
|---|---|---|
| 设备无视频流、VLC黑屏 | 开机未执行RTSP推流脚本 | cd /etc/config && ./rtsp_start_zl.sh |
| 云端socat绑定端口失败 | 僵尸socat进程残留 | pkill -9 -f socat |
| MediaServer启动报554端口占用 | 服务已在后台运行 | ps aux |
| A端NC隧道秒退 | FIFO文件缺失/端口未监听/网络不通 | rm+mkfifo重建管道、ping校验网络、检查554端口 |
| NC进程被挂起停止运行 | BusyBox终端挂载冲突 | kill %1 && setsid 重启隧道 |
| API提示URL拼写错误 | URL未编码/密钥错误 | 替换编码后URL、核对SECRET密钥 |
| VLC无法连接流地址 | 未执行API添加流代理 | 重新执行云端curl代理添加命令 |
七、全流程标准化执行口诀(核心总结)
开机先启推流脚本,清完进程再启服务;先搭设备隧道,后调云端API;URL必须编码,僵尸进程必杀,管道每次重建,端口逐项校验。
八、从零到成功标准完整执行顺序(极简版)
-
IP摄像机开机:
cd /etc/config && ./rtsp_start_zl.sh启动推流 -
设备校验端口、网络,重建FIFO管道,启动NC双向隧道
-
云服务器强杀残留进程,清理核心端口
-
云端启动ZLMediaKit服务、socat端口桥接
-
云端执行编码后API命令,添加流代理
-
手机VLC输入公网地址,拉流播放
更多推荐




所有评论(0)