【问题标题】:plays multiple wav files at same time, for drum machine in Python同时播放多个 wav 文件,用于 Python 中的鼓机
【发布时间】: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


【解决方案1】:

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

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

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

【讨论】:

  • 所以我应该为每个鼓/钹打开不同的流,然后将其混合成一个输出?
  • 还是样品本身?那么,它们是否还足够可控?
  • 我自己将样本数据混合到一个输出立体声样本中,并在单个音频输出流上播放。 “可控”是什么意思?我想这完全取决于你如何进行混合。我建议先考虑通过 pyaudio 播放单独的输出流
  • 可控我的意思是我可以通过灵活的定时鼓声进行实时混音。现在我认为这是可能的,但比分离的音频流要困难得多,而且我认为音频流解决方案对于这个问题听起来更好。
  • 嗯,是的,这并不容易。我已经将它编程为一个练习,并自己学习更多关于 Python 中的音频操作的知识,如果你愿意,可以看一下,也许它会有所帮助 github.com/irmen/synthesizer#how-the-track-mixer-works
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-01-20
相关资源
最近更新 更多