我在Thread上播放声音设备时遇到一些问题。我在开头将声音设备导入为sd。然后在运行期间我想使用ASIO声卡在线程上播放音调。我需要在线程上执行的所有配置都运行良好。但是,当我想播放音调时,我得到以下错误:
sounddevice.PortAudioError:打开OutputStream时出错:意外的主机API 2错误0:u'无法加载ASIO驱动程序
如果我每次需要它时都在线程初始化导入,它就可以工作了。但我当然不想那样做。任何想法热点解决它?
谢谢!
这是一个简单的代码示例:
from threading import Thread
import numpy as np
import sounddevice as sd
class Test(Thread):
def __init__(self):
Thread.__init__(self)
#-- Configuration of the Tone to be played
self.fs = 44100 # sampling rate, in Hz, 44100 or 48000
duration = 1.05 # in seconds, may be float
f = 200.0 # sine frequency, Hz, may be float
self.tone_data = (np.sin(2*np.pi*np.arange(self.fs*duration)*f/self.fs)).astype(np.float32)
def run(self):
#-- Configuration of the ASIO sound card
#import sounddevice as sd
sd.default.channels = 2
sd.default.device = 14
print sd.query_devices(sd.default.device)['name']
#sd.default.latency = ('low','low')
#asio_out = sd.AsioSettings(channel_selectors=[1, 2])
#sd.default.extra_settings = asio_out
sd.default.samplerate = self.fs
sd.play(self.tone_data)
sd.wait()
w = Test()
w.start()
答案 0 :(得分:0)
这似乎是一个特定于平台的问题。我刚用ALSA / Linux试过它,它运行正常。使用ASIO,您可能必须在稍后用于创建流的同一个线程中执行库初始化(这发生在import
时间内)(play()
为您做了什么)?
如果我每次需要它时都在线程初始化导入,它就可以工作了。但我当然不想这样做。
你为什么不想这样做?您是否知道在Python中使用import
会自动缓存?第二次使用import
时,只会执行dict
次查找,而不会执行任何操作。
但你是对的,重复的import
仍然看起来有点奇怪。
您是否尝试在import
中仅执行一次Test.__init__()
?在那里你也可以做所有sd.default
的东西。
如果您在初始化期间仍然遇到问题(或者如果您坚持在顶部进行所有导入),则可以尝试使用未记录的_initialize()
和_terminate()
函数,请参阅{{3} }。
如果要使用多个Thread
实例,则会遇到play()
函数的问题,该函数用于单线程使用。但是,只有一个Python线程可以执行音频I / O,这可能更有意义。另请参阅issue #3。
顺便说一句,您不需要(...).astype(np.float32)
,此转换会自动为您完成。
当我在它时,如果默认的输入和输出设备不同,你的行sd.query_devices(sd.default.device)['name']
将会中断。