我一直在开发一个 Python 程序来创建音频并播放现有的声音文件。我可以生成多个进程并让它们全部播放到笔记本电脑扬声器,但我想知道是否可以将每个信号发送到单独的声音设备。这样我就可以将效果应用于某些过程,但不能同时应用于所有过程。
我使用的是 MacBook 和 python
simpleaudio
,它调用 AudioToolbox 来连接到输出设备。我还安装了 ffmpeg
,所以如果更容易的话可以使用 ffplay
。 pydub
库使用此功能 - 将当前波形导出到临时文件,然后使用子进程和 ffplay
来播放它。
我可以获得设备列表,但不确定如何使用此列表来选择设备。
% ffplay -devices
Devices:
D. = Demuxing supported
.E = Muxing supported
--
E audiotoolbox AudioToolbox output device
D avfoundation AVFoundation input device
D lavfi Libavfilter virtual input device
E sdl,sdl2 SDL2 output device
D x11grab X11 screen capture, using XCB
我确实看到一篇文章建议使用
ffmpeg
来列出设备,但我又不知道如何使用这个列表。
% ffmpeg -f lavfi -i sine=r=44100 -f audiotoolbox -list_devices true -
Input #0, lavfi, from 'sine=r=44100':
Duration: N/A, start: 0.000000, bitrate: 705 kb/s
Stream #0:0: Audio: pcm_s16le, 44100 Hz, mono, s16, 705 kb/s
Stream mapping:
Stream #0:0 -> #0:0 (pcm_s16le (native) -> pcm_s16le (native))
Press [q] to stop, [?] for help
[AudioToolbox @ 0x135e3f230] CoreAudio devices:
[AudioToolbox @ 0x135e3f230] [0] Background Music, (null)
[AudioToolbox @ 0x135e3f230] [1] Background Music (UI Sounds), BGMDevice_UISounds
[AudioToolbox @ 0x135e3f230] [2] MacBook Air Microphone, BuiltInMicrophoneDevice
[AudioToolbox @ 0x135e3f230] [3] MacBook Air Speakers, BuiltInSpeakerDevice
[AudioToolbox @ 0x135e3f230] [4] Aggregate Device, ~:AMS2_Aggregate:0
Output #0, audiotoolbox, to 'pipe:':
Metadata:
encoder : Lavf59.27.100
Stream #0:0: Audio: pcm_s16le, 44100 Hz, mono, s16, 705 kb/s
Metadata:
encoder : Lavc59.37.100 pcm_s16le
size=N/A time=00:00:05.06 bitrate=N/A speed=0.984x
video:0kB audio:436kB subtitle:0kB other streams:0kB global headers:0kB muxing overhead: unknown
Exiting normally, received signal 2.
这至少给了我一个可识别的设备列表。如果我添加更多聚合设备,我可以在每个设备上播放不同的文件吗?
看起来没有人知道如何使用
simpleaudio
或 ffmpeg
执行此操作,但 sounddevice
库对 I/O 设备有更好的控制。另一个依赖,耶!