在python中同时播放2个声音和多处理器

问题描述:

我需要同时播放2个声音,使用多处理而不是线程来查看它是否解决了线程顺序播放音频而不是并行播放音频的问题。我猜测这是由于Python中的全局解释器锁(GIL)造成的。在python中同时播放2个声音和多处理器

我加了a question 2天前,但我的描述过于复杂。这是简单的版本:

音频被导入为numpy数组。我借此阵列,通过scikits.audiolab模块玩:

import scikits.audiolab as audiolab 

# This is how I import my wav file. "frames" is the numpy array, "fs" = sampling 
# frequency, "encoder" = quantizing at 16 bits 

frames, fs, encoder = audiolab.wavread('audio.wav') 

# This is how I play my wav file. audiolab plays the frames array at a frequency of 
# 44100 Hz 
audiolab.play(frames, fs=44100) 

这很好,但是这是我需要帮助的:利用多打2个文件在同一时间。

frames1, fs1, encoder1 = audiolab.wavread('audio1.wav') 
frames2, fs2, encoder2 = audiolab.wavread('audio2.wav') 

audiolab.play(frames1, fs=44100) 
audiolab.play(frames2, fs=44100) 

如果您想要控制两个声音的相对时间(例如,它们应该同时开始),使用多个进程可能不是一个好的解决方案。您应该在应用程序中混合信号并写出一个音频流。

由于您使用的是audiolab,因此您已经拥有numpy数组中的数据。这给你所有你需要混合音频的灵活性:

frames1, fs1, encoder1 = audiolab.wavread('audio1.wav') 
frames2, fs2, encoder2 = audiolab.wavread('audio2.wav') 
mixed = frames1 + frames2 

audiolab.play(mixed, fs=44100) 

如果这导致音频信号夹(你听到咔嗒/噼噗),您可能需要混合之前预先尺度的数据:

mixed = frames1/2 + frames2/2 

..如果声音不具有相等的长度,它可能需要更多一点的工作:

mixed = np.zeros(max(len(frames1), len(frames2)), dtype=frames1.dtype) 
mixed[:len(frames1)] += frames1/2 
mixed[:len(frames2)] += frames2/2 
+0

你知道,@Luke,我尝试了一种非常类似的方法,它只是不想合作,但是你的解决方案完成了这项工作。谢谢。 –

更好的方式来处理,这是使用已经知道如何混合音频流库 - 两个不同的进程试图共享音频硬件充其量是解决这个问题的一个靠不住的方式。

PygamePyAudio(Python绑定到PortAudio)。

+0

有趣。我会检查出来并给你一个更新。 –

+0

我积极使用pygame或pyaudio会有效,但卢克的答案做了我正在寻找的东西。 –

+0

如何使用pyaudio一次输出两个流? – endolith