не может изящно остановить воспроизведение звука с помощью pydub или playsound в python

Этот вопрос был задан и ответил здесь: Остановить воспроизведение звука в pydub

Тем не менее, один ответ не работает для меня. Я использую pydub, Python 3.6 на Ubuntu 18.04. Я новичок в Python (но не в программировании!).

Я пробовал несколько вариантов следующего кода, включая приведенный выше:

def ring():
sound_alarm = True
while True:
    try:
        print(f'sound_alarm is {sound_alarm}')
        if sound_alarm == False:
            return
        play(sound)
    except KeyboardInterrupt:
        sound_alarm = False
        print('done playing sound.')
        break

Я получаю следующее:

sound_alarm is True
^Csound_alarm is True
^Csound_alarm is True
sound_alarm is True

Я позволил ему зациклиться один раз, дважды попытался убить его, и, очевидно, он продолжал зацикливаться.

Вместо этого я попытался использовать playsound, но поведение определенно мне не нравится. Это не убивает воспроизведение сразу. Он останавливает воспроизведение, но дает очень уродливую трассировку стека (см. ниже). Однако, если я не могу убить его СЕЙЧАС, похоже, это не очень хорошее решение.

(python3.6:16669): GStreamer-CRITICAL **: 11:18:46.456: 
Trying to dispose element playbin, but it is in PLAYING instead of the NULL state.
You need to explicitly set elements to the NULL state before
dropping the final reference, to allow them to clean up.
This problem may also be caused by a refcounting bug in the
application or some element.

person Bill Turner    schedule 08.10.2019    source источник


Ответы (1)


Я бы рекомендовал использовать simpleaudio для воспроизведения (pydub будет использовать его по умолчанию, если он установлен). Который должен мгновенно реагировать на прерывание клавиатуры, поскольку он воспроизводится в отдельном потоке.

person Jiaaro    schedule 25.10.2019