VLC Player зависает GUI (поток Python?) - PullRequest
0 голосов
/ 31 мая 2018

У меня есть этот кусок кода, который работает без проблем:

Media_list = instance.media_list_new(song_list)
list_player = instance.media_list_player_new()
list_player.set_media_list(Media_list)
list_player.play() 

Как бы я ни хотел, чтобы пройти через список и использовать обычный проигрыватель vlc для его воспроизведения.

playing = set([1,2,3,4])
for i in song_list:
player.set_mrl(i)
player.play()
play=True
while play == True:
    time.sleep(1)
    play_state = player.get_state()
    if play_state in playing:
        continue
    else:
        play = False

Это делает почти то же самое, и это лучше соответствует моим потребностям, однако оно замораживает мой графический интерфейс (qml / pyside2).Так что теперь я cofused, я должен создать новый поток для этого, или есть какой-то другой способ сделать это в VLC.

Ну, я попытался создать новый поток и запустить в нем функцию выше,однако та же проблема, в тот момент, когда игрок переходит к циклу и запускает метод воспроизведения, графический интерфейс останавливается. (VLC работает нормально и воспроизводит список воспроизведения, но графический интерфейс не отвечает на длительность)

, так что просто расширитьнемного, это та часть, которая у меня есть, и она работает нормально, но я не могу получить данные из своих песен во время их воспроизведения, поскольку у меня есть только URL, а не метаданные.

song_list=[]
r = requests.get('https://www.youtube.com/playlist?list=PLD6s0l-FZhjkc-TYwXO5GbwyxFqTd5Y9J')
page = r.text
soup=bs(page,'html.parser')
res=soup.find_all('a',{'class':'pl-video-title-link'})
for l in res:
    #print (l.get("href"))
    #print("https://www.youtube.com"+l.get("href"))
    yt ='https://www.youtube.com'
    temp =l.get("href")
    url =yt+temp
    video = pafy.new(url)
    bestaudio = video.getbestaudio()
    song = bestaudio.url
    #print(video.getbestaudio().url)
    song_list.append(song)

Media_list = instance.media_list_new(song_list)
list_player = instance.media_list_player_new()
list_player.set_media_list(Media_list)
list_player.play() 

чтоя хотел бы это:

@Slot()
def print_yt_playlist(self):
song_list=[]
r = requests.get('https://www.youtube.com/playlist?list=PLD6s0l-FZhjkc-TYwXO5GbwyxFqTd5Y9J')
page = r.text
soup=bs(page,'html.parser')
res=soup.find_all('a',{'class':'pl-video-title-link'})
for l in res:
    #print (l.get("href"))
    #print("https://www.youtube.com"+l.get("href"))
    yt ='https://www.youtube.com'
    temp =l.get("href")
    url =yt+temp
    video = pafy.new(url)
    bestaudio = video.getbestaudio()
    song = bestaudio.url
    #print(video.getbestaudio().url)
    song_list.append(video)
 playing = set([1,2,3,4])
 for i in song_list:
     media = instance.media_new(i.getbestaudio().url)
     print(i.Artist) #THIS is what i want, i want to be able to acces that data for the song that is playing
     print(i.Duration) #and this and so on, that is why i want to loop through list, since i dont think i can do it with media_list
     player.set_media(media)
     player.play()
     play=True
 while play == True:
    time.sleep(1)
    play_state = player.get_state()
    if play_state in playing:
        continue
    else:
        play = False

Или, проще говоря, есть ли способ, которым я вставляю "video" в список media_list, а затем я могу получить доступ к данным о текущей песне, а также воспроизвести песню?

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

1 Ответ

0 голосов
/ 01 июня 2018

Ну, я потратил немного времени, и у меня есть решение, оно все еще в "грубом" состоянии, но оно работает, и оно не блокирует графический интерфейс, когда я его использую.Я поместил эту логику в новый поток, и я назвал ее оттуда, там нужно сделать много настроек.Я не знаю, является ли это наиболее «изящным» подходом, поэтому, если у кого-то есть идея получше, пожалуйста, не стесняйтесь говорить.

class Threaddy(QThread):

def __init__(self):
    QThread.__init__(self)

def __del__(self):
    self.wait()

def run(self):

    song_list=[]
    r = requests.get('https://www.youtube.com/playlist?list=PLD6s0l-FZhjkc-TYwXO5GbwyxFqTd5Y9J')
    page = r.text
    soup=bs(page,'html.parser')
    res=soup.find_all('a',{'class':'pl-video-title-link'})
    for l in res:
        #print (l.get("href"))
        #print("https://www.youtube.com"+l.get("href"))
        yt ='https://www.youtube.com'
        temp =l.get("href")
        url =yt+temp
        video = pafy.new(url)
        bestaudio = video.getbestaudio()
        song = bestaudio.url
        #print(video.getbestaudio().url)
        song_list.append(video)

    for song in song_list:

        media=instance.media_new(song.getbestaudio().url) #THIS WORKS NOW

        media.get_mrl()
        player.set_media(media)
        player.play()
        print(song.title) #SO DOES THIS
        playing = set([1,2,3,4])
        time.sleep(1)
        duration = player.get_length() / 1000
        mm, ss = divmod(duration, 60)

        while True:
            state = player.get_state()
            if state not in playing:
                break
            continue    
...