Ubuntu 22.04下使用Python调用FFmpeg录制USB耳机输出音频的问题
Ubuntu 22.04下使用Python调用FFmpeg录制USB耳机输出音频的问题
看起来你已经在终端里成功用FFmpeg捕获USB耳机的输出音频了,但在Python里执行时遇到了问题——这种情况大多和Python调用子进程的方式、环境变量或者权限有关,我来给你梳理几个可行的解决思路:
先回顾下你的场景细节:
- 你通过
pactl list short sources确认了USB耳机的监听源为alsa_output.usb-0c76_USB_PnP_Audio_Device-00.analog-stereo.monitor,终端输出如下:0. alsa_output.usb-0c76_USB_PnP_Audio_Device-00.analog-stereo.monitor module-alsa-card.c s16le 2ch 48000Hz SUSPENDED 1. alsa_input.usb-0c76_USB_PnP_Audio_Device-00.mono-fallback module-alsa-card.c s16le 1ch 48000Hz SUSPENDED 2. alsa_output.pci-0000_00_1f.3.iec958-stereo.monitor module-alsa-card.c s16le 2ch 44100Hz SUSPENDED - 终端直接执行这条命令能成功录制10秒音频:
ffmpeg -f pulse -i alsa_output.usb-0c76_USB_PnP_Audio_Device-00.analog-stereo.monitor -t 10 output.wav
一、用subprocess正确调用FFmpeg
Python里调用外部命令最稳妥的方式是用subprocess.run(),并且把命令拆分成列表形式(避免shell解析带来的参数错误),给你写个可直接用的示例代码:
import subprocess # 将FFmpeg命令拆分为列表,每个参数单独作为一项 record_command = [ "ffmpeg", "-f", "pulse", "-i", "alsa_output.usb-0c76_USB_PnP_Audio_Device-00.analog-stereo.monitor", "-t", "10", "output.wav" ] try: # check=True会在命令返回非0状态时抛出异常,方便捕获错误 result = subprocess.run(record_command, check=True, capture_output=True, text=True) print("音频录制成功!") print("FFmpeg输出信息:\n", result.stdout) except subprocess.CalledProcessError as e: # 打印标准错误输出,这是排查问题的核心依据 print("录制失败,错误详情:\n", e.stderr)
二、排查环境变量差异
终端能执行但Python脚本不行,有时候是因为环境变量不同——比如Python的运行环境找不到FFmpeg的路径。你可以先在终端里用which ffmpeg获取FFmpeg的绝对路径,然后替换到代码里:
# 终端执行该命令,获取FFmpeg绝对路径 which ffmpeg # 输出示例:/usr/bin/ffmpeg
把代码里的"ffmpeg"替换成上述绝对路径即可。
三、检查PulseAudio权限
如果还是失败,可能是运行Python脚本的用户没有访问音频设备的权限,你可以将用户加入audio组:
sudo usermod -aG audio $USER
执行完成后注销再重新登录,权限即可生效。
四、激活音频监听设备
如果设备处于SUSPENDED状态,你可以在运行脚本前先激活它:
pactl set-source-port alsa_output.usb-0c76_USB_PnP_Audio_Device-00.analog-stereo.monitor analog-stereo
如果问题依然存在,记得把subprocess捕获到的stderr内容贴出来,这能帮你快速定位具体问题~
备注:内容来源于stack exchange,提问作者Dinh Chu
相关产品推荐
相关产品推荐

