从零搭建本地 RTSP 推流服务


🏗️ 核心架构设计

我们的推流服务由两个核心组件构成:

  1. MediaMTX (流媒体服务器):一个轻量级、免安装的 RTSP 服务器,负责接收视频流并提供拉流地址。
  2. FFmpeg (推流客户端):负责读取本地视频/摄像头,进行编码后推送到 MediaMTX。

数据流向 :本地视频 (MP4) -> FFmpeg (编码) -> MediaMTX (RTSP Server) -> Python/OpenCV (AI 智能体拉流分析)


一、 工具准备 (通用)

1. 下载 MediaMTX (服务器端)

MediaMTX 是一个单文件程序,无需安装,开箱即用。

  • 前往 GitHub Release 页面下载最新版:bluenviron/mediamtx/releases
  • Windows 下载:mediamtx_vX.X.X_windows_amd64.zip
  • Linux (x86_64) 下载:mediamtx_vX.X.X_linux_amd64.tar.gz
  • Linux (ARM64) 下载:mediamtx_vX.X.X_linux_arm64v8.tar.gz
2. 准备 FFmpeg (推流端)
  • Windows :强烈建议安装最新版 (6.x 或 7.x) 。旧版本 (如 4.x) 会导致 NVIDIA GPU 硬件加速报错。可通过 winget install Gyan.FFmpeg 安装,或去 gyan.dev 下载。
  • Linux :通常通过包管理器安装即可:sudo apt update && sudo apt install ffmpeg。

二、 Windows 环境部署指南 (本地开发)

步骤 1:启动 MediaMTX 服务器
  1. 解压下载的 mediamtx_windows_amd64.zip。
  2. 双击运行 mediamtx.exe。
  3. 此时会弹出一个黑色命令行窗口,显示 [RTSP] listener opened on :8554。保持此窗口开启,不要关闭。
    (注:若弹出 Windows 防火墙警告,请务必点击"允许访问"。)
步骤 2:使用 FFmpeg 推流

打开 PowerShell 或 CMD,进入你的视频所在目录,执行推流命令。

方案 A:使用 NVIDIA GPU 硬件加速(推荐,延迟极低)

powershell 复制代码
ffmpeg -re -stream_loop -1 -i your_video.mp4 -c:v h264_nvenc -preset p1 -tune ull -an -rtsp_transport tcp -f rtsp rtsp://127.0.0.1:8554/cam01

方案 B:使用 CPU 编码(兼容所有电脑)

powershell 复制代码
ffmpeg -re -stream_loop -1 -i your_video.mp4 -c:v libx264 -preset veryfast -tune zerolatency -vf scale=1280:720 -r 25 -an -rtsp_transport tcp -f rtsp rtsp://127.0.0.1:8554/cam01

(注:-vf scale=1280:720 -r 25 用于降低 CPU 压力,对于 AI 检测来说 720P/25帧 完全足够。)

步骤 3:Windows 后台运行技巧

如果你不想让黑框一直占用屏幕,可以创建一个 .bat 批处理脚本让它静默运行。

新建一个 start_push.bat 文件,写入以下内容:

bat 复制代码
@echo off
start /min ffmpeg -re -stream_loop -1 -i your_video.mp4 -c:v libx264 -preset veryfast -tune zerolatency -an -rtsp_transport tcp -f rtsp rtsp://127.0.0.1:8554/cam01

双击运行此 .bat 文件,FFmpeg 将在后台最小化运行。


三、 Linux 环境部署指南 (A100/云服务器)

在 Linux 服务器上,我们需要保证服务在断开 SSH 后依然稳定运行,且具备开机自启能力。

步骤 1:部署 MediaMTX 为系统服务 (Systemd)
  1. 下载并解压 :

    bash 复制代码
    wget https://github.com/bluenviron/mediamtx/releases/download/v1.9.3/mediamtx_v1.9.3_linux_amd64.tar.gz
    tar -xzf mediamtx_v1.9.3_linux_amd64.tar.gz
  2. 移动文件到系统目录 :

    bash 复制代码
    sudo mv mediamtx /usr/local/bin/
    sudo mv mediamtx.yml /usr/local/etc/
  3. 创建 Systemd 服务文件 :

    bash 复制代码
    sudo nano /etc/systemd/system/mediamtx.service

    填入以下内容:

    ini 复制代码
    [Unit]
    Description=MediaMTX RTSP Server
    After=network.target
    
    [Service]
    Type=simple
    User=root  # 或你的用户名如 ubuntu/wanghao
    WorkingDirectory=/usr/local/bin
    ExecStart=/usr/local/bin/mediamtx /usr/local/etc/mediamtx.yml
    Restart=always
    RestartSec=5
    
    [Install]
    WantedBy=multi-user.target
  4. 启动并设置开机自启 :

    bash 复制代码
    sudo systemctl daemon-reload
    sudo systemctl start mediamtx
    sudo systemctl enable mediamtx
    sudo systemctl status mediamtx  # 确认状态为 active (running)
步骤 2:使用 FFmpeg 后台推流

在 Linux 下,推荐使用 nohup 或 tmux 将推流任务放入后台。

方法 A:使用 nohup (标准后台运行)

bash 复制代码
nohup ffmpeg -re -stream_loop -1 -i your_video.mp4 -c:v libx264 -preset veryfast -tune zerolatency -an -rtsp_transport tcp -f rtsp rtsp://127.0.0.1:8554/cam01 > ffmpeg_push.log 2>&1 &
  • > ffmpeg_push.log 2>&1:将输出日志重定向到文件,防止日志塞满终端。
  • &:放入后台执行。
  • 查看日志 :tail -f ffmpeg_push.log
  • 停止推流 :pkill -f "your_video.mp4"

方法 B:使用 tmux (AI 开发者强烈推荐)

tmux 可以让你随时切回终端查看 FFmpeg 的实时状态。

bash 复制代码
# 1. 创建名为 push 的会话
tmux new -s push

# 2. 在会话中运行推流命令 (无需 nohup)
ffmpeg -re -stream_loop -1 -i your_video.mp4 -c:v libx264 -preset veryfast -tune zerolatency -an -rtsp_transport tcp -f rtsp rtsp://127.0.0.1:8554/cam01

# 3. 脱离会话 (放入后台):按 Ctrl+B,松开后按 D

# 4. 随时恢复会话查看状态:
tmux attach -t push
步骤 3:放行 Linux 防火墙 (关键!)

如果外部机器需要拉流,必须放行端口:

bash 复制代码
# Ubuntu/Debian (UFW)
sudo ufw allow 8554/tcp
sudo ufw allow 8554/udp
sudo ufw allow 8000:8001/udp

# CentOS/RedHat (Firewalld)
sudo firewall-cmd --zone=public --add-port=8554/tcp --permanent
sudo firewall-cmd --zone=public --add-port=8000-8001/udp --permanent
sudo firewall-cmd --reload

(如果是阿里云/腾讯云等云服务器,必须在网页控制台的"安全组"中放行 8554 TCP 和 UDP 端口。)


四、 验证与 AI 智能体代码接入

1. 使用 VLC 播放器验证
  • 打开 VLC -> 媒体 -> 打开网络串流。
  • 输入:rtsp://<服务器IP>:8554/cam01
  • 优化延迟 :在设置中将"网络缓存时间"修改为 200 毫秒。点击播放,画面应秒开。
2. Python (OpenCV) 接入智能体框架

在你的 AI 框架中,使用以下代码接管视频流,开始你的头肩检测/行人检测业务:

python 复制代码
import cv2

# 替换为你的实际 RTSP 地址
RTSP_URL = "rtsp://127.0.0.1:8554/cam01" 

print(f"正在连接视频流: {RTSP_URL}")
# 使用 FFMPEG 后端拉流,稳定性更好
cap = cv2.VideoCapture(RTSP_URL, cv2.CAP_FFMPEG)

if not cap.isOpened():
    print("❌ 拉流失败!请检查 MediaMTX 是否运行,以及网络是否互通。")
    exit()

print("✅ 拉流成功!智能体视觉感知已启动...")

while True:
    ret, frame = cap.read()
    if not ret:
        print("⚠️ 视频流中断,尝试重连...")
        cap.release()
        cap = cv2.VideoCapture(RTSP_URL, cv2.CAP_FFMPEG)
        continue

    # ==========================================
    # 🧠 在这里接入你的 AI 模型
    # 例如:results = yolo_model(frame)
    # annotated_frame = results.plot()
    # ==========================================

    # 模拟处理:画个框
    cv2.rectangle(frame, (100, 100), (300, 300), (0, 255, 0), 2)
    cv2.putText(frame, "AI Agent Vision Active", (50, 50), 
                cv2.FONT_HERSHEY_SIMPLEX, 1, (0, 0, 255), 2)

    cv2.imshow("Agent Vision", frame)

    # 按 'q' 退出
    if cv2.waitKey(1) & 0xFF == ord('q'):
        break

cap.release()
cv2.destroyAllWindows()

五、 核心避坑指南 (FAQ)

问题现象 根本原因 解决方案
VLC 提示"无法连接 / 找不到 MRL" 1. MediaMTX 没启动。 2. 防火墙/安全组拦截了 8554 端口。 1. 检查服务器 MediaMTX 进程。 2. 检查系统防火墙及云厂商安全组规则。
FFmpeg 推流卡住,不输出日志 默认使用 UDP 传输,在复杂网络或 Windows 下极易丢包导致握手失败。 必须在 FFmpeg 命令中加入 -rtsp_transport tcp。
Linux 运行脚本报错 bad interpreter: No such file or directory Windows 下编写的 .sh 脚本,换行符是 CRLF,Linux 无法识别。 在 VSCode 右下角将换行符改为 LF,或在 Linux 下执行 sed -i 's/\r$//' script.sh。
Linux 运行脚本报错 Permission denied Windows 打包或拷贝到 Linux 的脚本丢失了可执行权限。 在 Linux 下手动赋予权限:chmod +x your_script.sh。
拉流画面延迟高达 3~5 秒 1. 播放器缓存过大。 2. FFmpeg 编码 GOP 设置过大。 1. VLC 缓存改为 200ms。 2. 确保 FFmpeg 加了 -tune zerolatency (CPU) 或 -preset p1 (GPU)。
Windows 下 GPU 编码报错 unsupported param FFmpeg 版本过旧 (如 4.x),不支持新版 NVIDIA 驱动的 NVENC API。 升级 Windows 下的 FFmpeg 到最新版 (6.x 或 7.x)。

按照这份教程,你已经拥有了一个工业级的、跨平台的本地视频流基建。接下来,你可以将全部精力投入到 LangGraph 编排、YOLO 模型训练和 VLM 大模型的接入中了!祝你的 AI 智能体开发顺利!

相关推荐
const_qiu1 小时前
第 2.5 章 2.5.8:质量关 —— 安全审查、UI/UX 审查与踩坑复盘
java·人工智能·安全·ui·ux
Solara1 小时前
一个标志位挂了 18 天不落地:它等的重启,2 天 14 小时后就完成了
人工智能·程序员·ai编程
xz2024102****1 小时前
agent基础知识:function calling,MCP,和Skill
大数据·人工智能·agent
格物致胜工业数智技术1 小时前
锂电纠偏测量那些坑,明治ETD-0612激光纠偏传感器怎么填?
人工智能·算法
远航计算机1 小时前
AI 答案里的链接,为什么开始分等级了?
大数据·人工智能·爬虫·aigc
LDG_AGI1 小时前
【口袋专家AI公开课】从0到1智能体开发(八):法律专家Agent原理与实战
人工智能
逐步走向自律1 小时前
运维手机应急 + 电脑多终端并行:2026 远程终端选型指南
人工智能·深度学习·机器学习·自然语言处理·数据科学
海带紫菜菠萝汤1 小时前
本周 AI 观察:算力、路由、账本——护城河正搬出模型层
人工智能·ai·程序员·架构·大模型
Wild API1 小时前
蒸馏小模型:独立答题和给大模型打草稿,差在哪里?
人工智能·大模型·知识蒸馏