【发布时间】:2017-07-31 00:18:36
【问题描述】:
我想像真正的架子鼓一样“同时”播放不同长度的不同 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 等...因为我认为会减慢我的程序。如果没有,我很期待。
【问题讨论】:
-
pydub 的播放在可用时使用 pyaudio,而 ffplay 作为后备。两者都旨在用于快速简便的调试,尽管pyaudio mechanism 可以 扩展为生产使用(我保证,你不希望 ffplay 用于任何真实的东西)。基本上,您只需将块变得更小(如果这是可接受的延迟量,则为 10 毫秒。它可能是)并在写入流之前一次 10 毫秒组合所有当前正在播放的音频信号。
标签: python audio pyaudio pydub