You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

树莓派FFmpeg推流YouTube时遇Alsa等错误求助

解决树莓派YouTube开机自动推流的三个核心问题

我来帮你逐个排查并解决这些问题,先从每个错误的根源入手:

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创建一个服务来实现开机自启:

  1. 创建服务文件:
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
  1. 启用并启动服务:
sudo systemctl daemon-reload
sudo systemctl enable yt-stream.service
sudo systemctl start yt-stream.service

现在树莓派开机后会自动启动推流,不需要任何手动操作。

内容的提问来源于stack exchange,提问作者Sherman B.

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.15 07:19:08