python-vlc 代码播放音频示例 最近也很困惑 为什么python-vlc打包后 plugins就找不到了 碰壁无数

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()

评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值