Fit*_*tzy 5 python portaudio asio pyaudio
我正在尝试在 Win7 上使用 PyAudio 连接到 PreSonus AudioBox 1818VSL,但在一次录制 2 个以上通道(立体声)时遇到一些问题。PreSonus 驱动程序创建许多立体声输入音频设备(例如立体声通道 1&2、3&4 等)和 18 个输入通道 ASIO 设备。我可以毫无问题地从任何立体声设备进行录音。为了最大限度地减少延迟并从 > 2 个通道进行录制,我尝试使用 ASIO 设备。
我一直在使用 PyAudio 的版本我一直在使用来自http://www.lfd.uci.edu/~gohlke/pythonlibs/#pyaudio,它编译了对 ASIO、DS、WMME、WASAPI、WDMKS 的支持。
致电pyaudio_handle.is_format_supported()显示 ASIO 设备支持 44.1、48 和 96 kHz 的 8 至 32 位数据。
下面是返回的字典pa.get_device_info_by_index(32)
{'defaultHighInputLatency': 0.046439909297052155,
'defaultHighOutputLatency': 0.046439909297052155,
'defaultLowInputLatency': 0.046439909297052155,
'defaultLowOutputLatency': 0.046439909297052155,
'defaultSampleRate': 44100.0,
'hostApi': 2L,
'index': 32,
'maxInputChannels': 18L,
'maxOutputChannels': 18L,
'name': u'AudioBox ASIO Driver',
'structVersion': 2L}
Run Code Online (Sandbox Code Playgroud)
下面是我用来创建 PyAudio 输入流的代码。回调函数只是将数据推送到列表中并返回,pyaudio.paContinue直到获得所需的样本量,然后返回pyaudio.paComplete。
pyaudio_handle = pyaudio.PyAudio()
stream = pyaudio_handle.open(
format=pyaudio.get_format_from_width(2,unsigned=False),
channels=4,
rate=48000,
input=True,
frames_per_buffer=256,
input_device_index=32,
stream_callback=pyaudio_stream_callback,
)
Run Code Online (Sandbox Code Playgroud)
尝试以高于 44.1 kHz 的速率初始化 ASIO 驱动程序会导致 PyAudio 挂起且无法返回。在 44.1 kHz 处初始化会产生以下错误:IOError: [Errno Unanticipated host error] -9999。
您可以提供的解决此错误的任何帮助都会有所帮助。我什至愿意证明 ASIO 在 Win7 上运行时可以在 PyAudio 中使用超过 2 个通道。谢谢。
我能够使用 ASIO 驱动程序以 96 kHz 录制 8 通道音频(M-audio M-Track 8)。
从
p = pyaudio.PyAudio()
p.get_device_info_by_index(4)
Run Code Online (Sandbox Code Playgroud)
我发现 'index': 4 是 ASIO 驱动程序:
{'defaultLowInputLatency': 0.005804988662131519,
'defaultHighOutputLatency': 0.09287981859410431,
'defaultLowOutputLatency': 0.005804988662131519,
'defaultSampleRate': 44100.0,
'maxInputChannels': 8,
'maxOutputChannels': 8,
'structVersion': 2,
'name': 'M-Audio M-Track Eight ASIO',
'index': 4,
'hostApi': 2,
'defaultHighInputLatency': 0.09287981859410431}
Run Code Online (Sandbox Code Playgroud)
因此,我从PyAudio上的示例代码开始,但从 Wave 切换到scipy.io.wavfile编写多通道 .wav 文件,因为wave仅支持立体声。
import pyaudio
import wave
import numpy as np
from scipy.io import wavefile
CHUNK = 1024
FORMAT = pyaudio.paInt16
CHANNELS = 8
RATE = 96000
RECORD_SECONDS = 10
WAVE_OUTPUT_FILENAME = "output.wav"
p = pyaudio.PyAudio()
stream = p.open(format=FORMAT,
channels=CHANNELS,
rate=RATE,
input=True,
input_device_index=4,
frames_per_buffer=CHUNK
)
print("* recording")
frames = []
for i in range(0, int(RATE / CHUNK * RECORD_SECONDS)):
data = stream.read(CHUNK)
frames.append(data)
print("* done recording")
stream.stop_stream()
stream.close()
p.terminate()
#Not really sure what b'' means in BYTE STRING but numpy needs it
#just like wave did...
framesAll = b''.join(frames)
#Use numpy to format data and reshape.
#PyAudio output from stream.read() is interlaced.
result = np.fromstring(framesAll, dtype=np.int16)
chunk_length = len(result) / CHANNELS
result = np.reshape(result, (chunk_length, CHANNELS))
#Write multi-channel .wav file with SciPy
wavfile.write(WAVE_OUTPUT_FILENAME,RATE,result)
Run Code Online (Sandbox Code Playgroud)
中提琴!96 kHz、16 位、8 通道 .wav 文件!
哦,细节
| 归档时间: |
|
| 查看次数: |
12395 次 |
| 最近记录: |