我正在寻找加载播放列表并随机播放其中包含的文件。
另外,当我按下按钮时,它们往往会多次发送信号,我尝试过 time.sleep 但它不起作用。
如你所见,我不是程序员,我尝试自己开始,除了这两项之外,一切都还不错。
非常感谢您的帮助。
这是我的代码:
# -*- coding: utf-8 -*-
from gpiozero import Button
from signal import pause
import vlc
import subprocess
import random
# Définir le chemin des listes de lecture
playlist1_path = "/home/Lebargy/Desktop/Liste1.m3u8"
playlist2_path = "/home/Lebargy/Desktop/Liste2.m3u"
# Créer une instance VLC
instance = vlc.Instance()
# Modifier la commande VLC pour spécifier le plein écran et masquer les contrôles
commande_vlc = "cvlc"
# Ouvrir VLC avec la commande modifiée
subprocess.Popen(commande_vlc, shell=True)
# Charger les listes de lecture
media_list1 = instance.media_list_new(\[playlist1_path\])
media_list2 = instance.media_list_new(\[playlist2_path\])
random.shuffle(media_list1)
random.shuffle(media_list2)
# Créer un lecteur VLC
player = instance.media_player_new()
list_player = instance.media_list_player_new()
list_player.set_media_player(player)
player.set_fullscreen(True)
# Configurer le volume
player.audio_set_volume(480)
# Charger la première liste de lecture dans le lecteur par défaut
list_player.set_media_list(media_list1)
# Démarrer la lecture
list_player.play()
# Variable pour suivre l'état de la vitesse de lecture
vitesse_acceleree = False
# Définir une fonction de rappel pour gérer l'événement d'appui sur le bouton p1
def bouton_p1_callback():
list_player.stop()
list_player.set_media_list(media_list1)
list_player.play()
player.set_fullscreen(True)
# Définir une fonction de rappel pour gérer l'événement d'appui sur le bouton p2
def bouton_p2_callback():
list_player.next() # Passer à la piste suivante dans la liste de lecture.
# Définir une fonction de rappel pour gérer l'événement d'appui sur le bouton p3
def bouton_p3_callback():
list_player.stop()
list_player.set_media_list(media_list2)
list_player.play()
player.set_fullscreen(True)
# Définir une fonction de rappel pour gérer l'événement d'appui sur le bouton d'accélération
def bouton_p4_callback():
global vitesse_acceleree
if list_player.is_playing():
if not vitesse_acceleree:
player.set_rate(3) # Accélérer la lecture (vitesse 3x)
vitesse_acceleree = True
else:
player.set_rate(1) # Revenir à la vitesse normale
vitesse_acceleree = False
# Créer des instances de boutons pour les broches GPIO correspondantes
bouton_p1 = Button(21)
bouton_p2 = Button(2)
bouton_p3 = Button(20)
bouton_p4 = Button(14)
# Assigner les fonctions de rappel aux événements "when_pressed" des boutons
bouton_p1.when_pressed = bouton_p1_callback
bouton_p2.when_pressed = bouton_p2_callback
bouton_p3.when_pressed = bouton_p3_callback
bouton_p4.when_pressed = bouton_p4_callback
# Mettre en pause le script pour le maintenir en cours d'exécution indéfiniment
pause()
@疯狂物理学家,嗨!因为我在几个引脚上插入了一些按钮来触发一些操作。
事实上,我使用的是Gpiozero。
所以,目前,我仍然有按钮过敏的问题。
我更改了在播放列表中随机播放文件的代码,但似乎始终播放文件夹中相同的前 10 个文件。
对我来说还有另一个谜团,当我按下按钮时,下一个文件会全屏播放,但不会在屏幕中心对齐。
感谢您的浏览!
import os
import random
from gpiozero import Button, LED
from signal import pause
import vlc
import threading
import atexit
# Définir les chemins des dossiers
dossier1_path = "/home/Lebargy/Liste1"
dossier2_path = "/home/Lebargy/Liste2"
# Obtenir la liste des fichiers dans les dossiers
fichiers_dossier1 = [os.path.join(dossier1_path, f) for f in os.listdir(dossier1_path) if os.path.isfile(os.path.join(dossier1_path, f))]
fichiers_dossier2 = [os.path.join(dossier2_path, f) for f in os.listdir(dossier2_path) if os.path.isfile(os.path.join(dossier2_path, f))]
# Mélanger les listes de fichiers
random.shuffle(fichiers_dossier1)
random.shuffle(fichiers_dossier2)
# Créer une instance VLC
instance = vlc.Instance("--no-xlib --fullscreen --disable-screensaver --embedded-video --aout=alsa")
# Créer des listes de médias VLC
media_list1 = instance.media_list_new(fichiers_dossier1)
media_list2 = instance.media_list_new(fichiers_dossier2)
# Créer un lecteur VLC et un lecteur de liste
player = instance.media_player_new()
# Activer le mode plein écran
player.set_fullscreen(True)
list_player = instance.media_list_player_new()
list_player.set_media_player(player)
# Charger la première liste de lecture dans le lecteur par défaut
list_player.set_media_list(media_list2)
player.audio_set_volume(50)
# Démarrer la lecture
list_player.play()
# Déclarer la LED
led = LED(17)
# Définir une fonction pour vérifier si du son est en cours de lecture
def verifier_son_en_cours():
while True:
media_position = player.get_position()
if media_position is not None and media_position != 0.0 and player.get_state() == vlc.State.Playing:
led.on()
else:
led.off()
threading.Event().wait(1) # Attendre 1 seconde avant de vérifier à nouveau le son
# Définir une fonction de rappel pour gérer l'événement d'appui sur le bouton p1
def bouton_p1_callback():
list_player.stop()
list_player.set_media_list(media_list1)
led.on()
list_player.play()
# Définir une fonction de rappel pour gérer l'événement d'appui sur le bouton p2
def bouton_p2_callback():
list_player.next() # Passer à la piste suivante dans la liste de lecture.
# Définir une fonction de rappel pour gérer l'événement d'appui sur le bouton p3
def bouton_p3_callback():
list_player.stop()
list_player.set_media_list(media_list2)
led.off()
list_player.play()
# Définir une fonction de rappel pour gérer l'événement d'appui sur le bouton d'accélération
def bouton_p4_callback():
if list_player.is_playing():
rate = player.get_rate()
if rate == 1.0:
player.set_rate(3.0) # Accélérer la lecture (vitesse 3x)
else:
player.set_rate(1.0) # Revenir à la vitesse normale
# Créer des instances de boutons pour les broches GPIO correspondantes
bouton_p1 = Button(21)
bouton_p2 = Button(2)
bouton_p3 = Button(20)
bouton_p4 = Button(14)
# Assigner les fonctions de rappel aux événements "when_pressed" des boutons
bouton_p1.when_pressed = bouton_p1_callback
bouton_p2.when_pressed = bouton_p2_callback
bouton_p3.when_pressed = bouton_p3_callback
bouton_p4.when_pressed = bouton_p4_callback
# Nettoyage
def nettoyer_gpio():
bouton_p1.close()
bouton_p2.close()
bouton_p3.close()
bouton_p4.close()
led.close
atexit.register(nettoyer_gpio)
# Mettre en pause le script pour le maintenir en cours d'exécution indéfiniment
pause()