Как отключить вход python, когда заканчивается аудиоплеер VL C? - PullRequest
0 голосов
/ 28 марта 2020

Я пытаюсь создать программу для воспроизведения музыки c в Python3, используя python-vlc для воспроизведения аудиофайлов. Я хочу иметь возможность приостанавливать и воспроизводить звук, пока песня не закончена. У меня есть функция playSong(path), которая воспроизводит аудиофайл по заданному пути, и метод main, который вызывает функцию playAudio по любому указанному пути песни. У меня также есть несколько других функций для загрузки песен с YouTube, используя youtube-dl. У нет проблем с main или любым другим способом. Проблема в функции playSong.

Вот мой код:

import os
import re
import sys
import random
import vlc
import ytUrl
import youtube_dl
from termcolor import colored
from mutagen.mp3 import MP3

...

def playSong(path):
    audio = MP3(path)
    duration = audio.info.length  # This is not in use as of right now
    player = vlc.MediaPlayer(path)
    player.audio_set_delay(1000)  # keeps vlc from playback freezing issues
    player.play()
    print("Playing " + colored(path[:-len(".mp3")], "green") + "...")

    # the problem is here
    while True:
        do = input("> ").lower()
        if do == "pause":
            player.pause()
        elif do == "play":
            player.play()
        elif do == "stop" or do == "skip":
            player.stop()
        elif do == "exit":
            player.stop()
            main() 

Проблема в том, что метод playSong не завершится, когда player закончит песню из-за while True l oop. Программа застряла на

do = input("> ").lower()

, даже когда проигрыватель закончил. Я не могу просто вынуть while l oop, потому что я хочу иметь возможность играть и останавливать песню все время!

Как это исправить? Любая помощь приветствуется!

1 Ответ

1 голос
/ 29 марта 2020

Это работает для меня в Ubuntu. Я верю, что это также будет работать на Ма c, но не на Windows:

import os
import re
import selectors
import sys
import random
import vlc
import ytUrl
import youtube_dl
from termcolor import colored
from mutagen.mp3 import MP3

...

def playSong(path):
    audio = MP3(path)
    duration = audio.info.length  # This is not in use as of right now
    player = vlc.MediaPlayer(path)
    player.audio_set_delay(1000)  # keeps vlc from playback freezing issues
    player.play()
    print("Playing " + colored(path[:-len(".mp3")], "green") + "...")

    sel = selectors.DefaultSelector()
    sel.register(sys.stdin.fileno(), selectors.EVENT_READ)

    while True:
        sys.stdout.write('> ')
        sys.stdout.flush()
        # Poll for command input as long as the player hasn't reached the end
        while player.get_state() != vlc.State.Ended:
            if sel.select(0.1):
                break  # Input avaliable - time to read input, so stop polling
        else:
            break  # Quit the command handling loop
        do = input().lower()
        if do == "pause":
            player.pause()
        elif do == "play":
            player.play()
        elif do == "stop" or do == "skip":
            player.stop()
        elif do == "exit":
            player.stop()
            main()
...