如何并行启动两个 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。这很好,但就我的目的而言,它可能在计算上很昂贵。
谢谢!
我建议将 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()
函数不等到声音播放完毕)
这是问题所在:
我想使用 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。这很好,但就我的目的而言,它可能在计算上很昂贵。
谢谢!
我建议将 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()
函数不等到声音播放完毕)