Как запустить два потока Pydub параллельно? - PullRequest
0 голосов
/ 20 ноября 2018

Вот проблема:

Я хочу воспроизводить два аудиофайла в формате mp3 или mpeg параллельно, используя pydub.Что я заметил, так это то, что я могу без проблем запустить один поток, но он зависает, пока не закончится первый аудиофайл.Только после этого запускается второй файл.

Я полагаю, что это связано с питоном 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, преобразовать его в волну, затемкормить его в pyaudio на волоске.Это хорошо, но это может быть вычислительно дорого для моих целей.

Ссылка для обхода

Спасибо!

1 Ответ

0 голосов
/ 20 ноября 2018

Я рекомендую использовать pydub с simpleaudio , который поддерживает одновременное воспроизведение нескольких звуков.Простой пример см. pydub.playback._play_with_simpleaudio(), который вы также можете просто использовать, если хотите.

Основная функция pydub.playback.play() пытается представить те же функции независимо от того, какой метод воспроизведения используется.используется, поэтому он ожидает завершения воспроизведения, но simpleaudio прекрасно работает с параллельным воспроизведением (а функция _play_with_simpleaudio() не ожидает завершения воспроизведения звука)

...