树莓派3B+(Debian Bullseye系统):如何实现摄像头推流YouTube Live同时本地定时分段存储视频
树莓派3B+(Debian Bullseye系统):如何实现摄像头推流YouTube Live同时本地定时分段存储视频
我来帮你搞定这个需求!你之前尝试的tee或者liquidsoap其实没必要,用ffmpeg的原生多路输出功能就能同时实现YouTube推流和本地定时分段存储,而且配置起来更直接,适配树莓派3B+的资源情况。
先明确你的核心需求点,我们逐个对应解决:
- 视频源:
libcamera-vid输出800x600/15fps的H.264流 - 音频源:系统默认音频输入(替换你原来的静音源
anullsrc) - 双输出:实时推流YouTube + 本地/mnt/smb目录24小时分段存储,文件名带秒级时间戳
完整实现命令
首先设置YouTube推流的环境变量(把your-youtube-stream-key-here换成你自己的直播密钥):
export YOUTUBE_SERVER_URL="rtmp://a.rtmp.youtube.com/live2/" export YOUTUBE_KEY="your-youtube-stream-key-here"
然后执行以下组合命令:
libcamera-vid --inline --nopreview -t 0 --width 800 --height 600 --framerate 15 --codec h264 -o - | ffmpeg \ -f alsa -i default \ -thread_queue_size 1024 -use_wallclock_as_timestamps 1 -i pipe:0 \ # 第一个输出:推流到YouTube -c:v copy -c:a aac -preset fast -strict experimental -f flv "$YOUTUBE_SERVER_URL$YOUTUBE_KEY" \ # 第二个输出:本地24小时分段存储 -c:v copy -c:a aac -f segment -segment_time 86400 -strftime 1 -segment_format mp4 "/mnt/smb/recording_%Y%m%d_%H%M%S.mp4"
关键参数解释
音频源修正:
把原来的anullsrc静音源换成-f alsa -i default,这样就能获取系统默认的音频输入设备。如果你的音频设备不是default,可以用arecord -l查看设备列表,然后指定比如hw:0,0。本地分段存储:
-f segment:启用ffmpeg的分段输出模式-segment_time 86400:设置每个分段的时长为86400秒(也就是24小时)-strftime 1:允许用时间戳格式生成文件名/mnt/smb/recording_%Y%m%d_%H%M%S.mp4:文件名模板,%Y%m%d_%H%M%S会生成精确到秒的时间戳(比如recording_20240520_143025.mp4)-segment_format mp4:用MP4格式存储,方便后续直接播放
性能优化:
-c:v copy和-c:a aac:视频直接复制(避免重新编码浪费CPU),音频转成AAC(YouTube支持的格式)-preset fast:推流时用快速编码预设,减少树莓派的CPU负载
额外建议
确保SMB挂载稳定:
如果/mnt/smb是网络共享目录,建议在/etc/fstab里配置自动挂载,避免存储中断。比如://server/share /mnt/smb cifs username=xxx,password=xxx,uid=pi,gid=pi 0 0后台运行与开机自启:
如果你希望命令持续后台运行,甚至开机自动启动,可以创建一个systemd服务:
创建/etc/systemd/system/youtube-stream.service文件:[Unit] Description=树莓派YouTube直播+本地录制服务 After=network.target [Service] User=pi Environment="YOUTUBE_SERVER_URL=rtmp://a.rtmp.youtube.com/live2/" Environment="YOUTUBE_KEY=your-youtube-stream-key-here" ExecStart=/bin/bash -c 'libcamera-vid --inline --nopreview -t 0 --width 800 --height 600 --framerate 15 --codec h264 -o - | ffmpeg -f alsa -i default -thread_queue_size 1024 -use_wallclock_as_timestamps 1 -i pipe:0 -c:v copy -c:a aac -preset fast -strict experimental -f flv "$YOUTUBE_SERVER_URL$YOUTUBE_KEY" -c:v copy -c:a aac -f segment -segment_time 86400 -strftime 1 -segment_format mp4 "/mnt/smb/recording_%Y%m%d_%H%M%S.mp4"' Restart=always RestartSec=10 [Install] WantedBy=multi-user.target然后启用并启动服务:
sudo systemctl daemon-reload sudo systemctl enable youtube-stream.service sudo systemctl start youtube-stream.service测试验证:
- 先单独测试音频录制:
arecord -d 5 test.wav,播放确认音频正常 - 先测试本地分段存储(暂时去掉推流部分),确认文件生成和分段正常后再加上推流
- 先单独测试音频录制:
关于你提到的其他工具
- tee:需要手动处理流的复制,容易出现同步问题,不如ffmpeg原生多输出可靠
- liquidsoap:更适合复杂的流媒体编排场景,你的需求用ffmpeg足够,没必要增加复杂度
- GStreamer:虽然也能实现,但需要把libcamera-vid的流转成GStreamer格式,配置更繁琐,不如直接用ffmpeg对接高效
备注:内容来源于stack exchange,提问作者tputkonen
相关产品推荐
相关产品推荐

