【问题标题】:Open audio with callback using ALSA使用 ALSA 打开带有回调的音频
【发布时间】:2015-05-13 23:44:30
【问题描述】:

是否可以在 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 是否有官方邮件列表、repo、论坛等?我没有发现任何积极的发展。

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

【问题讨论】:

    标签: python linux audio python-multithreading alsa


    【解决方案1】:

    我已经成功地让它与 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 示例。

    【讨论】:

      【解决方案2】:

      我不确定我是否正确。 但是你尝试过“aplay”吗?

      aplay /path/to/file/file.wav
      

      但我认为你只能用它玩 wav。 抱歉,如果这不是您要找的。 ALSA 的文档记录并不完善,尤其是对于 PI。

      【讨论】:

      • 不,我不想这样播放 .wav。我希望能够像在许多音频应用程序中一样使用缓冲区打开一个设备,每 1024 个样本向声卡发送一些数据。
      猜你喜欢
      • 2019-05-21
      • 2021-05-19
      • 2020-08-28
      • 2013-08-25
      • 2018-11-16
      • 2019-04-27
      • 2016-01-12
      • 1970-01-01
      • 2021-11-29
      相关资源
      最近更新 更多