1. 创建启动脚本sudo nano /usr/local/bin/rtsp-stream.sh添加内容#!/bin/bash # RTSP 音视频推流服务脚本 # 适配 Raspberry Pi 3B Camera Module USB 麦克风 # 配置项 WIDTH1280 HEIGHT720 FRAMERATE15 VIDEO_BITRATE2000000 AUDIO_DEVICEhw:1,0 # USB 麦克风根据实际情况修改 RTSP_PATHlive RTSP_PORT8554 # 日志函数 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_ENABLED0 else AUDIO_ENABLED1 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] DescriptionRTSP Audio/Video Streaming Service Documentationhttps://github.com/bluenviron/mediamtx Afternetwork.target sound.target Wantsnetwork.target sound.target [Service] Typesimple # 运行用户树莓派默认用户 Userpi Grouppi # 工作目录 WorkingDirectory/home/pi # 环境变量 EnvironmentPATH/usr/local/bin:/usr/bin:/bin EnvironmentLD_LIBRARY_PATH/usr/lib EnvironmentDISPLAY:0 # 启动命令 ExecStartPre/bin/sleep 5 ExecStartPre/bin/bash -c until arecord -l /dev/null 21; do sleep 1; done ExecStart/usr/local/bin/rtsp-stream.sh # 重启策略 Restartalways RestartSec5 StartLimitInterval60s StartLimitBurst3 # 进程管理 KillModemixed KillSignalSIGTERM TimeoutStopSec10 # 日志输出 StandardOutputappend:/var/log/rtsp-stream.log StandardErrorappend:/var/log/rtsp-stream.log SyslogIdentifierrtsp-stream # 资源限制Pi 3B 优化 CPUQuota80% MemoryMax256M [Install] WantedBymulti-user.target3. 创建 MediaMTX 服务可选分离部署如果需要单独管理 MediaMTXsudo nano /etc/systemd/system/mediamtx.service[Unit] DescriptionMediaMTX RTSP Server Afternetwork.target [Service] Typesimple Userpi ExecStart/usr/local/bin/mediamtx /usr/local/etc/mediamtx.yml Restartalways RestartSec5 [Install] WantedBymulti-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常用管理命令命令作用sudo systemctl start rtsp-stream启动服务sudo systemctl stop rtsp-stream停止服务sudo systemctl restart rtsp-stream重启服务sudo systemctl status rtsp-stream查看状态sudo journalctl -u rtsp-stream -f实时查看日志sudo systemctl disable rtsp-stream禁用开机自启故障排查音频设备未找到# 查看可用音频设备 arecord -l # 测试录音 arecord -D hw:1,0 -f S16_LE -c 1 -r 44100 -d 5 test.wav aplay test.wav修改脚本中的AUDIO_DEVICEhw: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 网络波动重连的功能吗