import os
import threading
import time
import tkinter as tk
import vlc
from ctypes import CDLL
import keyboard
# ====== 设置 VLC 插件路径和 libvlc.dll 路径 ======
VLC_PLUGIN_PATH = r"E:\vlc_vlc\VLC\plugins"
LIBVLC_PATH = r"E:\vlc_vlc\VLC\libvlc.dll"
# os.environ['VLC_PLUGIN_PATH'] = VLC_PLUGIN_PATH
# os.environ['PATH'] = os.path.dirname(LIBVLC_PATH) + ';' + os.environ.get('PATH', '')
# ====== 初始化 VLC 实例 ======
player = None
media_player = None
try:
if os.name == 'nt':
CDLL(LIBVLC_PATH)
player = vlc.Instance(f'--plugin-path={VLC_PLUGIN_PATH}')
media_player = player.media_player_new()
print("✅ VLC 初始化成功")
except Exception as e:
print(f"❌ VLC 初始化失败: {e}")
exit(1)
# ====== 全局变量 ======
status_label = None
status_window = None
is_paused_by_space = False # 防止重复触发
def update_status(new_status):
global status_label
if status_label and status_label.winfo_exists():
try:
status_label.config(text=new_status)
except tk.TclError:
pass
def poll_vlc_state():
"""轮询当前播放状态"""
while True:
state = media_player.get_state()
if state == vlc.State.Playing:
update_status("播放中")
elif state == vlc.State.Paused:
update_status("已暂停")
elif state in [vlc.State.Ended, vlc.State.Error, vlc.State.Stopped]:
update_status("音频资源已释放")
break
time.sleep(0.2)
time.sleep(2)
if status_window and status_window.winfo_exists():
status_window.destroy()
def toggle_pause():
"""防止频繁点击空格键造成异常"""
global is_paused_by_space
if is_paused_by_space:
media_player.play()
update_status("播放中")
else:
media_player.pause()
update_status("已暂停")
is_paused_by_space = not is_paused_by_space
def create_status_window(root):
global status_window, status_label
status_window = tk.Toplevel(root)
status_window.title("音频播放状态(空格键可暂停音频/人工切入)")
status_window.geometry("435x100")
status_window.resizable(False, False)
x = (status_window.winfo_screenwidth() - 435) // 2
y = (status_window.winfo_screenheight() - 100) // 2
status_window.geometry(f"+{x}+{y}")
status_label = tk.Label(status_window,
text="播放中",
font=("SimHei", 14))
status_label.pack(expand=True, fill='both', anchor='center')
# 启动轮询线程
threading.Thread(target=poll_vlc_state, daemon=True).start()
def play_audio_with_status_window(file_path):
if not os.path.exists(file_path):
print(f"[ERROR] 文件不存在: {file_path}")
return
if not file_path.lower().endswith(('.mp3', '.m4a', '.wav', '.ogg')):
print(f"[ERROR] 不支持的音频格式: {file_path}")
return
media = player.media_new(file_path)
if not media.get_mrl():
print(f"[ERROR] 媒体加载失败: {file_path}")
return
media_player.set_media(media)
media_player.play()
print("正在播放音频...")
create_status_window(root)
# ====== 注册快捷键监听 ======
keyboard.on_press_key('space', lambda _: toggle_pause())
# ====== Tk 主界面初始化 ======
root = tk.Tk()
root.withdraw() # 隐藏主窗口
# ====== 测试入口 ======
if __name__ == '__main__':
audio_file = r"C:\Users\Lenovo\Desktop\20250628_162756.m4a"
play_audio_with_status_window(audio_file)
# 进入主事件循环(由 root.mainloop() 驱动)
root.mainloop()
python-vlc 代码播放音频示例 最近也很困惑 为什么python-vlc打包后 plugins就找不到了 碰壁无数
于 2025-07-10 19:56:36 首次发布





