Karsa Wang 's Blog

记录一些问题,也许对其他人也有所助益


🌊 树莓派直播方案折腾记录

树莓派摄像头直播,尝试了多种方案,记录一下。

📋 需求

将树莓派摄像头实时推送到浏览器,要求低延迟


🚀 尝试的方案

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 配置:

协议端口
RTSP8554
WebRTC8889
HLS8888

访问地址:http://树莓派IP:8889/stream/


💥 遇到的坑

  1. 📷 摄像头被占用 libcamera-still 或其他进程占用摄像头,需要 pkill -f libcamera 杀掉

  2. 🔧 ffmpeg 管道写法 复杂 filter 需要用单引号包住,避免 shell 转义问题

  3. 🌐 WebRTC 跨域 通过 nginx 反向代理时,直接用 8889 端口访问最稳定

  4. ⚙️ mediamtx API 需要在配置中启用 api: true


⏱️ 延迟测量

最终延迟约 200-400ms,通过对比视频内服务器时间戳和客户端时间手动计算。

播放地址:http://192.168.x.x:8889/stream/

左上角白色文字 = 服务器时间,对比你的电脑时间即可算出延迟。