首页 > 解决方案 > 清除 vlc media_list_player 的媒体列表将不允许重新启动媒体播放器

问题描述

我正在开发 Raspberry Pi 4B,我正在创建一个音乐播放器来替换自动点唱机的内部。我正在尝试使用组合键将音乐输入 VLC。在这种情况下,选择“A1”将转到作为“/media/usb1”安装到“A1”文件夹的 USB 记忆棒,将找到的任何媒体添加到 media_list_player 正在播放的播放列表中。这按设计工作。

当我试图清除媒体列表以重新开始时,我的问题就出现了。我需要使用相同的 media_list_player 名称,但是一旦我创建了一个新的媒体列表,我就无法重新启动播放器。

这是我的代码片段:

#!/usr/bin/env python3
#
import os, sys, csv, vlc, time, serial, configparser, termios, tty, subprocess
#
# Get Defaults
#
SoundBeforeSong = None
SoundAfterSong = None
TrackDelay = None
PlayHistory = None
USBDrive =  "/media/usb1/"
#
# Get keyboard input
#
def getch():  # getchar(), getc(stdin)  #PYCHOK flake
    fd = sys.stdin.fileno()
    old = termios.tcgetattr(fd)
    try:
        tty.setraw(fd)
        ch = sys.stdin.read(1)
    finally:
        termios.tcsetattr(fd, termios.TCSADRAIN, old)
    return ch
#
# Adding to playlist - Returns directory contents and adds to playlist
#
def addplaylist(track):
    list = None
    if os.path.isdir(os.path.join(USBDrive, track)):
        files = [f for f in os.listdir(os.path.join(USBDrive, track)) if os.path.isfile(os.path.join(USBDrive, track, f))]
        for f in files:
            if list is None:
                if SoundBeforeSong:
                    list = SoundBeforeSong + ";" + os.path.join(USBDrive, track, f)
                else:
                    list = os.path.join(USBDrive, track, f)
                if SoundAfterSong:
                    list = list + ";" + SoundAfterSong  
            else:
                if SoundBeforeSong:
                    list = list + ";" + SoundBeforeSong + ";" + os.path.join(USBDrive, track, f)
                else:
                    list = list + ";" + os.path.join(USBDrive, track, f)
                if SoundAfterSong:
                    list = list + ";" + SoundAfterSong
    else:
        print ("Error(3) - Selection folder not present")
    if list is None:
        print ("Error(4) - Selection has no media")
    else:
        if ";" in list:
            list = list.split(";")
            for song in list:
                media_list.add_media(song)
        else:
            media_list.add_media(list)
        print("add media play")
        if not media_player.is_playing():
            media_player.play() 
    return
#
# Define keyboard actions
#
def Jukebox():
    global Action, Bluetooth
    Sel_char = None
    while True:
        key = getch()
        try:
            Sel_char = int(key)
        except:
            try:
                Sel_char = key.upper()
            except:
                Sel_char = None
        if Sel_char == "Z":
            return False
        elif Sel_char == "W":
            if not media_player.is_playing():
                media_player.play()
            if media_player.is_playing():   
                media_player.stop()
                media_list = player.media_list_new()  # creating a new media list
                media_player.set_media_list(media_list)  # setting media list to the media player
        elif type(Sel_char) == str:
            Action = Sel_char
        elif type(Sel_char) == int:
            Action = Action + str(Sel_char)
            addplaylist(Action)
        else:
            pass
#
# Setting Up Media Player
#
# creating Instance class object
player = vlc.Instance('--no-xlib --quiet ') # no-xlib for linux and quiet don't complain
media_player = vlc.MediaListPlayer()  # creating a media player object
media_list = player.media_list_new()  # creating a new media list
media_player.set_media_list(media_list)  # setting media list to the media player
new = player.media_player_new()  # new media player instance
media_player.set_media_player(new)  # setting media player to it
media_events = new.event_manager()  # setting event handler
#
# Read keyboard input
#
print("Ready...")
Jukebox()
#
# Program is shutting down
#
sys.exit()

对我来说,我按下“A1”,音乐按预期开始。我按了“W”,它按预期停止了。在窗帘后面,我还通过创建一个新的空白列表来清除媒体列表。当我清除列表时,再次点击“W”没有任何作用,所以这是有道理的。我按“A1”并希望再次听到音乐,但我没有。我看到“添加媒体播放”,但没有声音。如何重新启动媒体列表播放器?或者可能更合适的问题是,我如何清除媒体列表(通过从列表中创建新媒体或删除媒体)并允许使用相同的引用来使用媒体播放器?

标签: pythonraspberry-pipython-vlc

解决方案


如果您希望以编程方式清除 vlc python 播放器的播放列表,那么在 .py 程序中使用 raspbian buster os、python3.7 这对我有用。

import subprocess
import time
import vlc

subprocess.call('vlc -d', shell=True)
time.sleep(.5)

def clearlist():
    check_list = subprocess.check_output("sudo pgrep -u pi vlc | cut -d' ' -f1", shell=True)
    time.sleep(.25)
    subprocess.run('sudo kill %d' % round(float(check_list.decode('ascii'))), shell=True)
    time.sleep(3)
    subprocess.call('vlc -d', shell=True)
    time.sleep(.5)
    subprocess.call('playerctl volume 0.5', shell=True)

杀死玩家并使用空白播放列表重新启动它更容易


推荐阅读