🌊 树莓派直播方案折腾记录
树莓派摄像头直播,尝试了多种方案,记录一下。
📋 需求
将树莓派摄像头实时推送到浏览器,要求低延迟。
🚀 尝试的方案
0️⃣ rpi-webrtc-streamer (放弃)
尝试使用 rpi-webrtc-streamer 项目。
环境配置:安装了一堆依赖库
git cmake libwebsocket libjsoncpp libboost-dev
libavformat-dev libavcodec-dev libavutil-dev
libswscale-dev libasound2-dev
问题:需要从源码编译,过程较复杂,环境配置也花了很久,最终放弃 ❌
1️⃣ HLS (HTTP Live Streaming)
libcamera-vid + ffmpeg 生成 m3u8,延迟 2-5 秒,太高 ❌
2️⃣ MJPEG
ffmpeg 转码为 Motion JPEG,通过 nginx 或 Python SimpleHTTPServer 推送。
问题:浏览器播放卡顿,体验不佳 ❌
3️⃣ WebRTC (最终方案) ✅
架构流程:
libcamera-vid → ffmpeg (添加时间戳) → RTSP → mediamtx → WebRTC
推流命令:
libcamera-vid -t 0 --inline -o - --width 480 --height 270 --framerate 15 \
| ffmpeg -i - -vf 'drawtext=fontfile=/usr/share/fonts/truetype/dejavu/DejaVuSansMono-Bold.ttf:text=%{localtime}:fontcolor=white:fontsize=20:x=10:y=10:box=1:boxcolor=black@0.5:boxborderw=5' \
-c:v libx264 -preset ultrafast -tune zerolatency -b:v 500k \
-f rtsp rtsp://localhost:8554/stream
mediamtx 配置:
| 协议 | 端口 |
|---|---|
| RTSP | 8554 |
| WebRTC | 8889 |
| HLS | 8888 |
访问地址:http://树莓派IP:8889/stream/
💥 遇到的坑
📷 摄像头被占用 libcamera-still 或其他进程占用摄像头,需要
pkill -f libcamera杀掉🔧 ffmpeg 管道写法 复杂 filter 需要用单引号包住,避免 shell 转义问题
🌐 WebRTC 跨域 通过 nginx 反向代理时,直接用 8889 端口访问最稳定
⚙️ mediamtx API 需要在配置中启用
api: true
⏱️ 延迟测量
最终延迟约 200-400ms,通过对比视频内服务器时间戳和客户端时间手动计算。
播放地址:http://192.168.x.x:8889/stream/
左上角白色文字 = 服务器时间,对比你的电脑时间即可算出延迟。