如何并行启动两个 pydub 线程?

How to launch two pydub threads in parallel?

这是问题所在:

我想使用 pydub 并行播放两个 mp3 或 mpeg 格式的音频文件。我注意到我可以毫无问题地启动一个线程,但它会挂起,直到第一个音频文件完成。然后才开始第二个文件。

我认为这是由于 python GIL。所以我认为线程将无法并行触发。我这样想对吗?

这是我的代码的一个简单版本:

from pydub import AudioSegment
from pydub.playback import play
import threading
from threading import Thread
from threading import Event

class Song(Thread):
    def __init__(self, filename):
        """initializes the thread"""
        Thread.__init__(self)
        self.soundfilename = filename
        self._stopper = Event()
        self.setName('SoundThread')

    def run(self):
        """plays a given audio file"""
        song = AudioSegment.from_mp3(self.soundfilename)
        play(song)

    def stop(self):
        self._stopper.set()

if __name__ == '__main__':

    s1 = '01. Born To Kill.mp3'
    s2 = 't1.mpeg'

    music1 = Song(s1)
    music2 = Song(s2)

    music1.run()
    music2.run()

我在这个问题上发现的唯一解决方法是获取 mp3,将其转换为 wave,然后通过线程将其提供给 pyaudio。这很好,但就我的目的而言,它可能在计算上很昂贵。

Link for workaround

谢谢!

我建议将 pydub 与 simpleaudio which supports concurrently playing multiple sounds. For a simple example see pydub.playback._play_with_simpleaudio() 一起使用,如果您愿意,您也可以直接使用它。

pydub.playback.play() 函数尝试呈现相同的功能,无论使用哪种播放方法,因此它等待播放完成,但 simpleaudio 在并发播放时工作正常(并且 _play_with_simpleaudio() 函数不等到声音播放完毕)