腾讯云 × 树莓派摄像头四周实战学习路线 第 2 周 · 第 14 天 · RTSP 实验 --- 学习小结

日期:2026-09-08 | 主题:树莓派摄像头 → RTSP 流 → 远程播放
定位:Linux 运维 4 周计划 · 第 2 周「摄像头 & 视频流」收官日
🎯 一、今日目标
让树莓派摄像头产生一条 RTSP 视频流,Mac 能远程播放,并量化延迟与码率这两个决定视频可用性的核心指标。
| 子目标 | 状态 |
|---|---|
| 摄像头能出图(走对采集路径) | ✅ |
| MediaMTX 开播,RTSP 8554 就位 | ✅ |
| Mac 用 ffplay 远程拉流成功 | ✅ |
| 实测码率 | ✅ 1.68 Mbps |
| 端到端延迟 | ⏳ 待补测 |
📚 二、核心内容
| 模块 | 关键知识点 |
|---|---|
| 摄像头类型识别 | CSI 排线摄像头 vs USB 摄像头的采集路径完全不同 |
| libcamera 栈 | CSI 摄像头必须走 libcamera(ISP 冲印),不能 v4l2 直采 |
| MediaMTX | Go 单文件流媒体服务器,专攻 RTSP;rpiCamera 源原生支持树莓派摄像头 |
| RTSP 协议 | 先握手协商(DESCRIBE/SETUP/PLAY)再推流,适合实时监看 |
| 硬件编码 | 树莓派 H.264 硬件编码器,using hardware H264 encoder,不吃 CPU |
| 码率与延迟 | 动态码率特性;延迟构成与低延迟调优的取舍 |
🍕 三、生活比喻
比喻 1:RTSP = 电视台播放系统
| 角色 | 现实类比 | 软件对应 |
|---|---|---|
| 摄像头 | 演播室摄像机 | /dev/video0(imx219) |
| 推流服务 | 电视台播出机房 | MediaMTX |
| RTSP 协议 | 电视频道 | rtsp://192.168.0.108:8554/cam |
| 播放器 | 你家电视机 | ffplay / VLC |
| 码率 | 信号清晰度(带宽) | Mbps 越大越清晰越卡 |
| 延迟 | 演播室→电视的时差 | ms |
RTSP vs HTTP:HTTP 是"点一下就给"(外卖);RTSP 是"先打电话协商 → 开通频道 → 才推流"(打电话给电视台)。所以 RTSP 适合实时监看,但延迟天然比 HTTP 高。
比喻 2:CSI vs USB 摄像头 ------ 便利店 vs 农场
- USB 摄像头 = 便利店:东西(图像)在店里已经加工包装好,你直接买(v4l2 读)就能用。
- CSI 摄像头 = 农场 :送来的是带泥的 raw 原料 (Bayer RAW 电信号),必须你在家洗切炒 (ISP 处理)才能吃。直接生吃(v4l2 直读)会拉肚子------这就是
Invalid argument的由来。
🔧 四、实战记录(完整可复用命令)
环境档案
| 项 | 值 |
|---|---|
| 树莓派账号 / 主机名 | hxxxx / hxxxx |
| 系统 | Debian 13 (trixie),aarch64 |
| 摄像头 | imx219(树莓派官方 Camera Module V2,800 万像素) |
| libcamera | v0.7.2,rpicam-apps 已装 |
| MediaMTX | v1.21.0 |
| 树莓派局域网 IP | 192.168.0.108 |
| RTSP 拉流地址 | rtsp://192.168.0.108:8554/cam |
步骤 1:确认摄像头身份
bash
v4l2-ctl --list-devices
判读要点 :找 unicam (platform:fe801000.csi) → 说明是 CSI 摄像头 。bcm2835-codec / bcm2835-isp / rpi-hevc-dec 那些 video10~31 都是编解码器子设备,不是摄像头。
步骤 2:用 libcamera 抓图验证
bash
rm -f ~/test.jpg
rpicam-still -o ~/test.jpg -t 2000
ls -lh ~/test.jpg
✅ 成功标志:1.4M,时间戳是刚才 。
ℹ️ Failed to create egl preview / drm preview 是 SSH 无桌面导致的预览窗缺失,不是错误。
步骤 3:装 MediaMTX
bash
cd ~
wget https://github.com/bluenviron/mediamtx/releases/download/v1.21.0/mediamtx_v1.21.0_linux_arm64.tar.gz
# 国内慢可换镜像:https://ghfast.top/https://github.com/...(同上路径)
tar -xzf mediamtx_v1.21.0_linux_arm64.tar.gz
步骤 4:配置 rpiCamera 源
bash
cp mediamtx.yml mediamtx.yml.bak
cat > mediamtx.yml <<'EOF'
paths:
cam:
source: rpiCamera
rpiCameraWidth: 1280
rpiCameraHeight: 720
rpiCameraFPS: 30
rpiCameraBitrate: 2000000
EOF
步骤 5:开播
bash
./mediamtx
成功标志(背下来):
INF [path cam] [RPI Camera source] started
INF [RTSP] started with listeners on :8554 (TCP/RTSP)
configuring streams: (0) 1280x720-YUV420/Rec709
using hardware H264 encoder ← 硬件编码生效
INF [path cam] stream is available and online, 1 track (H264) ← 流已上线
步骤 6:Mac 远程拉流
bash
ffplay -rtsp_transport tcp rtsp://192.168.0.108:8554/cam
✅ 输出:Video: h264 (Main), yuv420p(progressive), 1280x720, 30 fps
步骤 7:测码率
bash
ffmpeg -rtsp_transport tcp -i rtsp://192.168.0.108:8554/cam -c copy -t 10 ~/cam10s.h264 -y 2>/dev/null
ls -lh ~/cam10s.h264
结果 :2.0M / 10 秒 → 2.0 MiB × 8 ÷ 10 = 约 1.68 Mbps
🕳️ 五、今日踩坑(3 个,都是高价值坑)
坑 1:test.jpg 有 290K,其实是个"昨天的幽灵"
- 现象 :
ffmpeg -f v4l2明明报错了,但ls -lh显示test.jpg有 290K,看着像成功 - 真因 :那是 DAY13 残留的旧文件 (时间戳
Sep 7 23:34),当天命令压根没生成新文件 - 教训 :看文件时间戳,别只看大小,旧文件会骗人
- 动作 :排查前先
rm -f再重跑
坑 2:CSI 摄像头不能用 ffmpeg -f v4l2 直采
- 现象 :
ioctl(VIDIOC_G_PARM): Inappropriate ioctl for device+ioctl(VIDIOC_STREAMON): Invalid argument - 真因:CSI 摄像头是裸传感器,输出 Bayer RAW 电信号,必须经 ISP 冲印才能成像
- 解决 :改走 libcamera(
rpicam-still/ MediaMTXrpiCamera源) - 判断口诀 :
v4l2-ctl --list-devices里出现unicam ... .csi→ 就是 CSI,别用 v4l2
坑 3:MediaMTX 下载 404
-
现象 :
mediamtx_v1.21.0_linux_arm64v8.tar.gz→ 404 -
真因 :新版文件名改成了
linux_arm64,去掉了v8后缀,老教程全失效 -
解决 :
mediamtx_v1.21.0_linux_arm64.tar.gz -
防坑技巧(通用):装任何 GitHub 软件前先查真实文件名
bashcurl -sL https://api.github.com/repos/作者/项目/releases/latest | grep '"name"' -
架构对照 :
aarch64→arm64;armv7l→armv7;x86_64→amd64
📊 六、关键数据
| 指标 | 数值 | 说明 |
|---|---|---|
| 分辨率 | 1280x720 | 配置生效 |
| 帧率 | 30 fps | 配置生效 |
| 编码 | H.264 Main,硬件编码 | 不吃 CPU |
| 目标码率 | 2 Mbps(2000000) | 配置值 |
| 实测码率 | 约 1.68 Mbps | 目标值的 84%,动态码率正常表现 |
| 播放 58 秒丢帧 | 7 帧 | 可忽略 |
| 端到端延迟 | 待补测 | 见下节 |
🔜 七、延伸方向
- 让流穿透到公网(frp / 内网穿透),从腾讯云服务器远程看
- 把 RTSP 流转成 HLS/WebRTC,直接在网页里看(MediaMTX 已内置 8888/8889 端口)
- 接入之前部署的 SRS(RTMP 1935),对比 RTSP vs RTMP 的延迟差异
- 用 systemd 把 MediaMTX 做成开机自启服务(复习 DAY4 的 systemctl)
今日金句:
排查问题先看时间戳,装软件先查官方 release。
教程会过时,但报错信息和官方文档不会骗你。