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

如何实时读取Linux进程/系统音频输出?树莓派LED同步需求

解决树莓派流式音频同步LED脉动问题

一、实时捕获系统音频输出

1. 使用PulseAudio(树莓派新版默认推荐)

  • 创建空输出设备(sink),将系统音频路由至此并捕获输出:
    pactl load-module module-null-sink sink_name=monitor_sink sink_properties=device.description="Audio_Monitor"
    pactl set-default-sink monitor_sink
    
  • 后续可通过parec命令直接捕获该sink的音频,或在Python中通过库连接此源。

2. 使用ALSA Loopback设备

  • 加载loopback内核模块:
    sudo modprobe snd-aloop
    
  • 修改ALSA配置文件/etc/asound.conf,将默认输出设为loopback,并创建捕获设备:
    pcm.loopback {
        type plug
        slave {
            pcm "hw:Loopback,0,0"
        }
    }
    
    pcm.monitor {
        type plug
        slave {
            pcm "hw:Loopback,0,1"
        }
    }
    
    defaults.pcm.card 1  # 用`aplay -l`确认loopback设备的卡号,替换此处数字
    defaults.pcm.device 0
    
  • 配置完成后,系统音频将输出至loopback设备,可从monitor设备捕获音频数据。

二、实时采样音频并控制LED

通过Python捕获音频流,计算RMS(均方根)音量反映响度,以此控制GPIO LED的PWM亮度。以下是基于sounddevice库的示例代码:

import sounddevice as sd
import numpy as np
import RPi.GPIO as GPIO
import sys

# GPIO初始化
LED_PIN = 18  # 选用硬件PWM引脚(12、13、18、19)以降低延迟
GPIO.setmode(GPIO.BCM)
GPIO.setup(LED_PIN, GPIO.OUT)
pwm = GPIO.PWM(LED_PIN, 1000)  # 1kHz PWM频率
pwm.start(0)

# 音频参数,根据系统实际配置调整
SAMPLE_RATE = 44100
BLOCK_SIZE = 512  # 块越小延迟越低,树莓派可尝试256~1024

def audio_callback(indata, frames, time, status):
    if status:
        print(status, file=sys.stderr)
    # 计算RMS音量并转换为0-100的PWM占空比
    rms = np.sqrt(np.mean(indata**2))
    # 增益系数可根据实际音频响度微调
    volume = min(rms * 1200, 100)
    pwm.ChangeDutyCycle(volume)

# 启动音频捕获,设备名对应之前创建的监控设备
try:
    with sd.InputStream(
        samplerate=SAMPLE_RATE,
        blocksize=BLOCK_SIZE,
        device="Audio_Monitor",  # PulseAudio设备名;ALSA则用"monitor"
        channels=1,
        callback=audio_callback
    ):
        print("音频监控中,按Ctrl+C退出...")
        while True:
            pass
except KeyboardInterrupt:
    print("程序退出")
finally:
    pwm.stop()
    GPIO.cleanup()

安装依赖:

pip install sounddevice numpy rpi.gpio
sudo apt-get install libportaudio2

三、监控特定Python进程的音频

若仅需跟踪自身Python脚本的音频输出,而非整个系统:

  1. 在播放音频的Python代码中,指定输出设备为monitor_sink(需对应所用音频库的设备参数,如sounddevice的device参数)。
  2. 或用PulseAudio重定向特定进程的音频至监控sink:
    # 替换1234为目标Python进程的PID
    pactl load-module module-redirect-sink sink=monitor_sink pid=1234
    

四、优化同步延迟

  • 调小BLOCK_SIZE值(如256),但需注意CPU占用情况。
  • 优先使用树莓派硬件PWM引脚,避免软件PWM的延迟。
  • 关闭无关系统进程,减少资源占用。

内容的提问来源于stack exchange,提问作者etotheipi

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.18 05:43:28