如何在 Python 中同时在一个 USB 设备上播放音频并在另一个设备上录制音频?
How do I play audio on one USB device and record audio on another simultaneously in Python?
我正在 Python 中编写程序以在 Focusrite Scarlett 6i6 上播放音频,同时在 Picoscope 2205AMSO 上录制另一个波形。要在 Focusrite 上播放音频,我使用的是声音设备库:
sounddevice.play(noise, blocking=True)
为了记录其他波形,我正在使用 picoscope 库:
ps.runBlock()
ps.waitReady()
dataA = ps.getDataV('A', nSamples, returnOverflow=False)
但是,这两个语句不会同时运行,因为它们是阻塞的。如果我从 sounddevice.play 函数调用中删除 "blocking = True" 参数,那么它永远不会播放音频。有没有一种方法可以在不阻塞的情况下进行录制和播放?
我能够通过使用 asyncio 库同时获得这两个功能 运行:
import asyncio
def record():
ps.runBlock()
ps.waitReady()
def play():
sounddevice.play(noise, blocking=True)
async def non_blocking(loop, executor):
await asyncio.wait(
fs={
loop.run_in_executor(executor, play),
loop.run_in_executor(executor, record),
},
return_when=asyncio.ALL_COMPLETED
)
loop = asyncio.get_event_loop()
executor = concurrent.futures.ThreadPoolExecutor(max_workers=5)
loop.run_until_complete(non_blocking(loop, executor))
我正在 Python 中编写程序以在 Focusrite Scarlett 6i6 上播放音频,同时在 Picoscope 2205AMSO 上录制另一个波形。要在 Focusrite 上播放音频,我使用的是声音设备库:
sounddevice.play(noise, blocking=True)
为了记录其他波形,我正在使用 picoscope 库:
ps.runBlock()
ps.waitReady()
dataA = ps.getDataV('A', nSamples, returnOverflow=False)
但是,这两个语句不会同时运行,因为它们是阻塞的。如果我从 sounddevice.play 函数调用中删除 "blocking = True" 参数,那么它永远不会播放音频。有没有一种方法可以在不阻塞的情况下进行录制和播放?
我能够通过使用 asyncio 库同时获得这两个功能 运行:
import asyncio
def record():
ps.runBlock()
ps.waitReady()
def play():
sounddevice.play(noise, blocking=True)
async def non_blocking(loop, executor):
await asyncio.wait(
fs={
loop.run_in_executor(executor, play),
loop.run_in_executor(executor, record),
},
return_when=asyncio.ALL_COMPLETED
)
loop = asyncio.get_event_loop()
executor = concurrent.futures.ThreadPoolExecutor(max_workers=5)
loop.run_until_complete(non_blocking(loop, executor))