如何让Odroid等待RTSP流激活后再启动播放?
问题:实现摄像头与Odroid同时开机时自动启动RTSP流播放
设备配置
- 海康威视IP摄像头
- 交换机
- 运行Ubuntu系统的Odroid
核心需求
摄像头与Odroid均配置静态IP,要求两台设备同时开机时,RTSP流能自动启动并在显示器上显示摄像头实时画面。
当前实现方案
- 编写bash脚本
startvideo.sh:
#!/bin/bash while true; do /usr/bin/cvlc -vvv -f 'rtsp://摄像头静态IP/流地址' sleep 5 done
- 赋予脚本执行权限:
chmod +x startvideo.sh
- 将脚本添加至Ubuntu自动启动列表。
遇到的问题
当Odroid在摄像头已激活后开机时,流播放正常;但摄像头与Odroid同时开机时,Odroid开机速度快于摄像头,脚本因无法连接摄像头而启动失败。
尝试过的无效方法
- 在循环前添加固定延迟:
#!/bin/bash sleep 180 while true; do /usr/bin/cvlc -vvv -f 'rtsp://摄像头静态IP/流地址' sleep 5 done
固定延迟不可靠——摄像头启动时间存在波动,延迟过短仍会失败,过长则浪费等待时间。
- 尝试用ping检测摄像头状态:
#!/bin/bash while true; do if ping -c1 摄像头静态IP &> /dev/null then /usr/bin/cvlc -vvv -f 'rtsp://摄像头静态IP/流地址' sleep 5 break; else echo '摄像头未激活' fi sleep 3 done
该脚本仅检测一次摄像头激活就退出循环,若VLC播放过程中摄像头断开(如重启),无法自动重连;且ping通仅代表网络可达,不代表RTSP服务已就绪,检测逻辑不准确。
解决方案:改进版检测+重连脚本
以下脚本会持续验证摄像头的RTSP服务可用性(而非仅检测网络连通),直到服务就绪后启动VLC,且VLC退出后会重新检测重连,确保稳定性:
#!/bin/bash # 配置参数 CAMERA_IP="你的摄像头静态IP" # 海康威视常用RTSP地址,需替换为实际地址,带认证格式为rtsp://用户名:密码@IP/h264/ch1/main/av_stream RTSP_URL="rtsp://${CAMERA_IP}/h264/ch1/main/av_stream" WAIT_INTERVAL=3 # 检测间隔(秒) # 等待摄像头RTSP服务就绪 wait_for_camera() { while true; do # 用cvlc静默测试连接,无音视频输出,仅验证RTSP服务是否可用 if /usr/bin/cvlc --play-and-exit --no-video --no-audio "${RTSP_URL}" 2>/dev/null; then echo "摄像头RTSP服务已就绪" break else echo "等待摄像头启动中..." sleep ${WAIT_INTERVAL} fi done } # 主循环:启动VLC,退出后重新检测摄像头 while true; do wait_for_camera echo "启动VLC播放RTSP流..." /usr/bin/cvlc -vvv -f "${RTSP_URL}" echo "VLC退出,将重新检测摄像头..." sleep ${WAIT_INTERVAL} done
脚本说明
- RTSP地址调整:若摄像头启用了认证,需在URL中加入用户名和密码,例如
rtsp://admin:12345@192.168.1.100/h264/ch1/main/av_stream,具体格式可参考海康威视官方文档。 - 检测逻辑优化:直接用cvlc尝试静默连接,比ping更准确——ping通仅代表网络可达,而RTSP服务可能还未完成启动。
- 自动重连机制:即使播放过程中摄像头断开(如断电重启),脚本会重新进入等待检测流程,恢复连接后自动重启VLC。
部署注意事项
- 替换脚本中的
CAMERA_IP和RTSP_URL为实际值。 - 保持脚本的自动启动配置不变,确保Odroid开机后自动运行该脚本。
内容的提问来源于stack exchange,提问作者sander voogt
相关产品推荐
相关产品推荐

