树莓派FFmpeg推流YouTube时遇Alsa等错误求助
我来帮你逐个排查并解决这些问题,先从每个错误的根源入手:
1. 修复 NameError: name 'stream' is not defined
这个错误很简单——你在代码里把FFmpeg进程变量命名为stream_pipe,但后续调用的时候却用了stream这个未定义的变量。只需要把所有stream替换成stream_pipe即可:
比如把camera.start_recording(stream.stdin, ...)改成camera.start_recording(stream_pipe.stdin, ...),stream.stdin.close()改成stream_pipe.stdin.close(),stream.wait()改成stream_pipe.wait()。
2. 解决FFmpeg无法找到流编码参数的问题
FFmpeg默认的流分析时长和探针大小不足以快速识别树莓派摄像头输出的H.264流参数,你需要在FFmpeg命令里添加两个参数来增大分析时长:
在ffmpeg命令开头加上-analyzeduration 1000000 -probesize 1000000,让FFmpeg有足够时间读取流的编码信息。
3. 核心问题:Unknown input format: 'alsa'
这个问题是因为你的FFmpeg版本没有编译ALSA音频输入支持,或者依赖包没装全。按以下步骤解决:
步骤1:重装带ALSA支持的FFmpeg
先卸载现有FFmpeg,然后安装完整版本:
sudo apt remove --purge ffmpeg sudo apt update sudo apt install ffmpeg libasound2-dev libavcodec-extra
步骤2:确认音频设备编号
运行以下命令查看可用的ALSA音频输入设备:
arecord -l
输出会类似:
**** List of CAPTURE Hardware Devices **** card 1: Device [USB Audio Device], device 0: USB Audio [USB Audio] Subdevices: 1/1 Subdevice #0: subdevice #0
如果你的设备是card 1, device 0,那hw:1,0是对的;如果不是,改成对应的编号(比如hw:0,0)。
备选方案:用arecord管道替代直接ALSA输入
如果还是报错,可以换用arecord抓取音频,再通过管道传给FFmpeg,把原命令里的音频部分替换成:
-i <(arecord -f S16_LE -r 8000 -c 1 -D hw:1,0)
修正后的完整Python脚本
import subprocess import picamera import time YOUTUBE = "rtmp://a.rtmp.youtube.com/live2/" KEY = "YOUR_PERSONAL_ENCODER_KEY" # 直接写字符串就行,不需要额外括号 # 修正后的FFmpeg命令,添加了分析参数,修复音频输入逻辑 stream_cmd = ( 'ffmpeg -analyzeduration 1000000 -probesize 1000000 ' '-f h264 -r 25 -i - ' '-itsoffset 5.5 -fflags nobuffer ' '-f alsa -ac 1 -i hw:1,0 ' '-vcodec copy -acodec aac -ac 1 -ar 8000 -ab 32k ' '-map 0:0 -map 1:0 -strict experimental -f flv ' f'{YOUTUBE}{KEY}' ) stream_pipe = subprocess.Popen(stream_cmd, shell=True, stdin=subprocess.PIPE) camera = picamera.PiCamera(resolution=(640, 480), framerate=25) try: now = time.strftime("%Y-%m-%d-%H:%M:%S") camera.framerate = 25 camera.vflip = True camera.hflip = True # 修正变量名,使用正确的stream_pipe camera.start_recording(stream_pipe.stdin, format='h264', bitrate=2000000) while True: camera.wait_recording(1) except KeyboardInterrupt: camera.stop_recording() finally: camera.close() # 修正变量名 stream_pipe.stdin.close() stream_pipe.wait() print("Camera safely shut down") print("Good bye")
实现开机自动启动(无需键鼠/SSH)
用systemd创建一个服务来实现开机自启:
- 创建服务文件:
sudo nano /etc/systemd/system/yt-stream.service
粘贴以下内容(注意替换脚本路径为你的实际路径):
[Unit] Description=Raspberry Pi YouTube Live Stream After=network.target [Service] User=pi ExecStart=/usr/bin/python3 /home/pi/your-stream-script.py WorkingDirectory=/home/pi Restart=always # 崩溃后自动重启 RestartSec=5 [Install] WantedBy=multi-user.target
- 启用并启动服务:
sudo systemctl daemon-reload sudo systemctl enable yt-stream.service sudo systemctl start yt-stream.service
现在树莓派开机后会自动启动推流,不需要任何手动操作。
内容的提问来源于stack exchange,提问作者Sherman B.

