使用 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 包的 documentation 和 playwav.py
示例。
是否可以在 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 包的 documentation 和 playwav.py
示例。