2017-03-09 110 views
3

我想播放不同长度的“同一时间”的不同长度的wav文件,这些文件独立于彼此,就像一个真正的鼓组。同时播放多个wav文件,适用于Python中的鼓机

我找到了音频控制,如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等......因为我认为这会减慢我的程序。如果没有,我期待着它。

+0

pydub的播放在可用时使用pyaudio,并作为后备使用。尽管[pyaudio机制](https://github.com/jiaaro/pydub/blob/master/pydub/playback.py#L22)_could可以扩展用于生产使用,但它们都用于快速简单的调试用途(我保证,你不想要任何真实的东西)。基本上你只需要把块缩小得多(比如10毫秒,如果这是一个可以接受的延迟时间,那很可能是),并且在写入流之前一次将所有当前播放的音频信号合并为10毫秒。 – Jiaaro

回答

1

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

恐怕你就需要使用更低级API毕竟,这让您可以同时打开多个音频通道。也许你可以用pyaudio自己做同样的Pyaudio环境中的多个流

我自己采取了不同的路线;我将所有样本混合在一起,形成单个输出流的单个结果输出样本。

+0

所以我应该为每个鼓/ cy打开不同的流然后将它混合成一个输出? – bence1971387

+0

还是样品本身?那么,他们仍然可以控制吗? – bence1971387

+0

我将自己的示例数据混合到一个输出立体声样本中,并通过单个音频输出流进行播放。 “可控”是什么意思?我想这完全取决于你如何做混合。我建议寻找通过pyaudio首先 –