Python+VLC+GPIO开发问题:播放列表随机播放与按钮防抖
问题解决方案
1. 播放列表随机播放实现
原代码直接对VLC的MediaList对象使用random.shuffle()无效,因为它不是Python原生列表。正确做法是先解析播放文件提取媒体路径,打乱顺序后再构建MediaList:
- 读取播放列表文件,过滤注释和空行
- 打乱媒体路径列表
- 用打乱后的路径创建新的VLC媒体列表
2. GPIO按钮防抖处理
GPIO按钮多次触发是机械抖动导致的,gpiozero的Button类内置了debounce_time参数可直接解决,无需手动用time.sleep()。设置防抖时间后,会自动过滤短时间内的重复触发信号。
修改后的完整代码
# -*- coding: utf-8 -*- from gpiozero import Button from signal import pause import vlc import random # 定义播放列表路径 playlist1_path = "/home/Lebargy/Desktop/Liste1.m3u8" playlist2_path = "/home/Lebargy/Desktop/Liste2.m3u" # 解析播放列表并返回打乱后的媒体路径列表 def load_and_shuffle_playlist(playlist_path): media_paths = [] with open(playlist_path, 'r', encoding='utf-8') as f: for line in f: line = line.strip() # 跳过M3U格式的注释和空行 if not line or line.startswith('#'): continue media_paths.append(line) random.shuffle(media_paths) return media_paths # 创建VLC实例 instance = vlc.Instance() # 创建VLC播放器 player = instance.media_player_new() list_player = instance.media_list_player_new() list_player.set_media_player(player) player.set_fullscreen(True) # 配置音量(VLC默认范围0-100,调整为合理值) player.audio_set_volume(80) # 加载并打乱播放列表 shuffled_playlist1 = load_and_shuffle_playlist(playlist1_path) shuffled_playlist2 = load_and_shuffle_playlist(playlist2_path) # 转为VLC MediaList对象 media_list1 = instance.media_list_new(shuffled_playlist1) media_list2 = instance.media_list_new(shuffled_playlist2) # 默认加载第一个播放列表 list_player.set_media_list(media_list1) list_player.play() # 跟踪播放速度状态 vitesse_acceleree = False # 按钮p1回调:切换到打乱后的播放列表1 def bouton_p1_callback(): list_player.stop() shuffled = load_and_shuffle_playlist(playlist1_path) new_media_list = instance.media_list_new(shuffled) list_player.set_media_list(new_media_list) list_player.play() player.set_fullscreen(True) # 按钮p2回调:切换下一曲目 def bouton_p2_callback(): list_player.next() # 按钮p3回调:切换到打乱后的播放列表2 def bouton_p3_callback(): list_player.stop() shuffled = load_and_shuffle_playlist(playlist2_path) new_media_list = instance.media_list_new(shuffled) list_player.set_media_list(new_media_list) list_player.play() player.set_fullscreen(True) # 按钮p4回调:切换播放速度 def bouton_p4_callback(): global vitesse_acceleree if list_player.is_playing(): if not vitesse_acceleree: player.set_rate(3) vitesse_acceleree = True else: player.set_rate(1) vitesse_acceleree = False # 创建带防抖的按钮实例(防抖时间0.3秒) bouton_p1 = Button(21, debounce_time=0.3) bouton_p2 = Button(2, debounce_time=0.3) bouton_p3 = Button(20, debounce_time=0.3) bouton_p4 = Button(14, debounce_time=0.3) # 绑定按钮事件 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 # 保持脚本运行 pause()
关键修改说明
- 随机播放优化:
- 新增
load_and_shuffle_playlist函数,确保每次加载播放列表都会重新打乱顺序 - 移除了无效的
subprocess.Popen("cvlc")调用,避免重复启动播放器进程
- 新增
- 防抖处理:
- 所有按钮实例添加
debounce_time=0.3参数,过滤机械抖动导致的重复触发 - 调整音量值到VLC合理范围(原480超出上限会被自动限制)
- 所有按钮实例添加
内容的提问来源于stack exchange,提问作者Julien Lebargy
相关产品推荐
相关产品推荐

