PaspberryPi推流
1. 创建启动脚本
sudo nano /usr/local/bin/rtsp-stream.sh添加内容:
#!/bin/bash # RTSP 音视频推流服务脚本 # 适配 Raspberry Pi 3B + Camera Module + USB 麦克风 # 配置项 WIDTH=1280 HEIGHT=720 FRAMERATE=15 VIDEO_BITRATE=2000000 AUDIO_DEVICE="hw:1,0" # USB 麦克风,根据实际情况修改 RTSP_PATH="live" RTSP_PORT=8554 # 日志函数 log() { echo "[$(date '+%Y-%m-%d %H:%M:%S')] $1" | tee -a /var/log/rtsp-stream.log } log "启动 RTSP 音视频推流服务..." # 检查摄像头 if [ ! -e /dev/video0 ]; then log "错误:未检测到摄像头设备 /dev/video0" exit 1 fi # 检查音频设备 if ! arecord -l | grep -q "card"; then log "警告:未检测到音频设备,将以纯视频模式启动" AUDIO_ENABLED=0 else AUDIO_ENABLED=1 log "检测到音频设备: $AUDIO_DEVICE" fi # 启动 MediaMTX(如果未运行) if ! pgrep -x "mediamtx" > /dev/null; then log "启动 MediaMTX 服务器..." /usr/local/bin/mediamtx & sleep 2 fi # 根据音频是否可用选择推流模式 if [ $AUDIO_ENABLED -eq 1 ]; then log "启动音视频同步推流 (视频+音频)..." # 使用进程替换实现双向管道 # 视频流 -> FFmpeg # 音频流 -> FFmpeg (通过文件描述符) rpicam-vid \ --width $WIDTH \ --height $HEIGHT \ --framerate $FRAMERATE \ --codec h264 \ --profile main \ --level 4.0 \ --inline \ --bitrate $VIDEO_BITRATE \ -t 0 \ -o - \ --nopreview | \ ffmpeg \ -hide_banner \ -loglevel warning \ -fflags nobuffer \ -flags low_delay \ -thread_queue_size 512 \ -i - \ -f alsa \ -thread_queue_size 1024 \ -ac 1 \ -ar 44100 \ -i $AUDIO_DEVICE \ -c:v copy \ -c:a aac \ -b:a 128k \ -preset ultrafast \ -tune zerolatency \ -f rtsp \ -rtsp_transport tcp \ "rtsp://localhost:$RTSP_PORT/$RTSP_PATH" \ 2>> /var/log/rtsp-stream.log else log "启动纯视频推流 (无音频)..." rpicam-vid \ --width $WIDTH \ --height $HEIGHT \ --framerate $FRAMERATE \ --codec h264 \ --profile main \ --level 4.0 \ --inline \ --bitrate $VIDEO_BITRATE \ -t 0 \ -o - \ --nopreview | \ ffmpeg \ -hide_banner \ -loglevel warning \ -fflags nobuffer \ -flags low_delay \ -i - \ -c:v copy \ -preset ultrafast \ -tune zerolatency \ -f rtsp \ -rtsp_transport tcp \ "rtsp://localhost:$RTSP_PORT/$RTSP_PATH" \ 2>> /var/log/rtsp-stream.log fi log "RTSP 推流已停止"赋予执行权限:
sudo chmod +x /usr/local/bin/rtsp-stream.sh2. 创建 Systemd 服务文件
sudo nano /etc/systemd/system/rtsp-stream.service添加内容:
[Unit] Description=RTSP Audio/Video Streaming Service Documentation=https://github.com/bluenviron/mediamtx After=network.target sound.target Wants=network.target sound.target [Service] Type=simple # 运行用户(树莓派默认用户) User=pi Group=pi # 工作目录 WorkingDirectory=/home/pi # 环境变量 Environment="PATH=/usr/local/bin:/usr/bin:/bin" Environment="LD_LIBRARY_PATH=/usr/lib" Environment="DISPLAY=:0" # 启动命令 ExecStartPre=/bin/sleep 5 ExecStartPre=/bin/bash -c 'until arecord -l > /dev/null 2>&1; do sleep 1; done' ExecStart=/usr/local/bin/rtsp-stream.sh # 重启策略 Restart=always RestartSec=5 StartLimitInterval=60s StartLimitBurst=3 # 进程管理 KillMode=mixed KillSignal=SIGTERM TimeoutStopSec=10 # 日志输出 StandardOutput=append:/var/log/rtsp-stream.log StandardError=append:/var/log/rtsp-stream.log SyslogIdentifier=rtsp-stream # 资源限制(Pi 3B 优化) CPUQuota=80% MemoryMax=256M [Install] WantedBy=multi-user.target3. 创建 MediaMTX 服务(可选,分离部署)
如果需要单独管理 MediaMTX:
sudo nano /etc/systemd/system/mediamtx.service[Unit] Description=MediaMTX RTSP Server After=network.target [Service] Type=simple User=pi ExecStart=/usr/local/bin/mediamtx /usr/local/etc/mediamtx.yml Restart=always RestartSec=5 [Install] WantedBy=multi-user.target4. 创建日志轮转配置
防止日志文件无限增长:
sudo nano /etc/logrotate.d/rtsp-stream/var/log/rtsp-stream.log { daily rotate 7 compress delaycompress missingok notifempty create 644 pi pi sharedscripts postrotate /bin/kill -HUP $(cat /var/run/syslogd.pid 2> /dev/null) 2> /dev/null || true endscript }5. 启用并启动服务
# 重新加载 systemd sudo systemctl daemon-reload # 创建日志文件 sudo touch /var/log/rtsp-stream.log sudo chown zhaohongbo:zhaohongbo /var/log/rtsp-stream.log # 启用开机自启(可选:先只启用 rtsp-stream,它会自动启动 MediaMTX) sudo systemctl enable rtsp-stream.service # 启动服务 sudo systemctl start rtsp-stream.service # 查看状态 sudo systemctl status rtsp-stream.service # 查看实时日志 sudo tail -f /var/log/rtsp-stream.log客户端播放地址
rtsp://<树莓派IP地址>:8554/live例如:
rtsp://192.168.1.100:8554/live常用管理命令
命令 | 作用 |
| 启动服务 |
| 停止服务 |
| 重启服务 |
| 查看状态 |
| 实时查看日志 |
| 禁用开机自启 |
故障排查
音频设备未找到
# 查看可用音频设备 arecord -l # 测试录音 arecord -D hw:1,0 -f S16_LE -c 1 -r 44100 -d 5 test.wav aplay test.wav修改脚本中的AUDIO_DEVICE="hw:X,Y"为实际设备号。
服务启动失败
# 检查详细错误 sudo journalctl -u rtsp-stream -n 50 --no-pager # 手动测试脚本 sudo -u pi /usr/local/bin/rtsp-stream.sh延迟过高
编辑脚本,在 FFmpeg 中添加:
-fflags nobuffer -flags low_delay \ -max_delay 500000 -bufsize 0 \需要我添加自动检测音频设备的逻辑,或者优化WiFi 网络波动重连的功能吗?
