3

我想像真正的鼓组一样独立地“同时”播放不同长度的不同 wav 文件。

我找到了不同的音频控制库,例如 PyAudio、Pydub 等,我认为解决这个问题的方法是线程化。但它根本不播放声音

from pydub import AudioSegment
from pydub.playback import play
import thread

def play_sound(f_directory,f_file):
    audio = AudioSegment.from_file(f_directory+f_file)
    play(audio)

thread.start_new_thread(play_sound,("drum samples/","ride_crash.wav"))
thread.start_new_thread(play_sound,("drum samples/","crash_hi.wav"))
thread.start_new_thread(play_sound,("drum samples/","kick.wav"))

如果我将此代码修改为此

from pydub import AudioSegment
from pydub.playback import play
import thread

def play_sound(f_directory,f_file):
    audio = AudioSegment.from_file(f_directory+f_file)
    play(audio)

thread.start_new_thread(play_sound("drum samples/","ride_crash.wav"))
thread.start_new_thread(play_sound("drum samples/","crash_hi.wav"))
thread.start_new_thread(play_sound("drum samples/","kick.wav"))

它只播放第一个。

我使用 PyDub 而不是 PyAudio 的原因是我认为 PyDub 的使用更容易,但在这种情况下可能没用。我也使用了覆盖,但问题是,它只在第一个文件的持续时间内播放所有文件。

我想知道,问题是什么,或者请让我知道是否有更好的解决方案,也许是另一个库,但如果可能的话,我想避免 PyGame 或 Pyglet 等......因为我认为这会减慢我的速度程序。如果没有,我很期待。

4

1 回答 1

1

多线程不是解决方案,因为据我所知 PyDub 使用的所有播放方法仅限于单个流

恐怕您毕竟需要使用更底层的 api,它可以让您同时打开多个音频通道。也许您可以通过从同一 Pyaudio 上下文中打开多个流来自己使用 pyaudio

我自己走了一条不同的路;我将所有样本混合在一起形成一个在单个输出流上播放的结果输出样本。

于 2017-03-09T21:42:36.783 回答