使用 ALSA 打开带回调的音频

Open audio with callback using ALSA

是否可以在 Python 中使用 ALSA 访问音频硬件进行播放,并带有回调函数:

def audiocallback():
    # create some audio and return a buffer of 1024 samples (~23 ms @ 44.1khz)
    # that is going to be played on the device
    return buffer

openaudio(deviceid=1, type=OUTPUT, freq=44100, buffersize=1024, callback = audiocallback)

python-alsaaudio可以吗? 或者另一个与 ALSA 相关的模块,比如 SDL? 或者通过 threading?

使用特定线程

注意:是否有 python-alsaaudio 的官方邮件列表、存储库、论坛等?我没有找到任何活跃的开发。

注2:我不想用PyAudio,因为在使用的时候,我在Raspberry Pi上出现了各种问题:因为它涉及到另外一层,PortAudio,这可能会增加该解决方案的权重。我在 PC x86 项目上成功使用了 PyAudio,但是在 Pi 上,由于各种原因,它似乎太重了,在这里讨论太长了。

我不确定我是否做对了。 但是你试过了吗"aplay"?

aplay /path/to/file/file.wav

但我认为你只能用它来播放 wav。 抱歉,如果这不是您要查找的内容。 ALSA 没有很好的文档记录,尤其是 PI。

我已经成功地让它与 python-alsaaudio 一起工作。没有用于此目的的开箱即用方法,但实现起来相对容易。

import alsaaudio
import random
import struct

BUFFER_SIZE = 1024

def noise_callback():
    return [random.randint(-20000, 20000) for i in range(BUFFER_SIZE)]

def openaudio(card_name, freq, buffer_size, callback):    
    device = alsaaudio.PCM(card=card_name)

    device.setchannels(1)
    device.setrate(freq)
    device.setformat(alsaaudio.PCM_FORMAT_S16_LE)

    device.setperiodsize(buffer_size)

    while True:
        samples = callback()
        data = struct.pack("h" * len(samples), *samples)
        device.write(data)

openaudio(card_name="default", freq=44100, buffer_size=BUFFER_SIZE, callback=noise_callback)

此示例不断将白噪声写入 alsa 默认音频设备,直到停止。

如果您想并行执行某些操作,则需要在单独的线程中启动 openaudio。据我了解,这是唯一的方法,因为文档说 PCM_ASYNC 模式尚未实现。

看起来上次提交到 python-alsaaudio 存储库是在 2011 年 8 月。因此几乎没有任何活动,例如论坛或邮件列表。但它的源代码看起来足够简单,可以快速挖掘。它是一个简单的包装器。

我使用的唯一信息是来自 python-alsaaudio 包的 documentationplaywav.py 示例。