2

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

我在 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)
4

2 回答 2

4

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

由于您使用的是 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
于 2013-07-20T18:33:05.423 回答
3

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

查看PygamePyAudio(Python 绑定到PortAudio)。

于 2013-07-20T16:18:55.827 回答