在python中使用多处理同时播放2个声音

时间:2013-07-20 15:54:08

标签: python multithreading multiprocessing scikits

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

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

音频作为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)

2 个答案:

答案 0 :(得分:3)

更好的方法是使用已经知道如何混合音频流的库 - 尝试共享音频硬件的两个不同进程充其量只是解决此问题的一种不可思议的方法。

查看PygamePyAudio(Python绑定到PortAudio)。

答案 1 :(得分:3)

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

由于您使用的是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