清除 vlc media_list_player的媒体列表将不允许重新启动媒体播放器



我正在开发树莓派4B,我正在创建一个音乐播放器来替换自动点唱机的内部。我正在尝试使用组合键将音乐输入VLC。在这种情况下,选择"A1"将转到以"/media/usb1"安装的U盘,并将找到的任何媒体添加到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",希望能再次听到音乐,但我没有。我看到";添加媒体播放";,但没有声音。如何重新启动媒体列表播放器?或者更合适的问题是,我如何清除媒体列表(通过创建新媒体或从列表中删除媒体(,并允许使用相同的引用来使用媒体播放器?

如果你想以编程方式清除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)

它只是更容易杀死播放器并用一个空白播放列表重新启动它

最新更新