使用python实现视频播放器(支持拖动播放位置跳转)

使用python实现视频播放器(支持拖动播放位置跳转)

Python实现视频播放器,在我早期的博文中介绍或作为资料记录过

Python实现视频播放器 https://blog.youkuaiyun.com/cnds123/article/details/145926189

Python实现本地视频/音频播放器https://blog.youkuaiyun.com/cnds123/article/details/137874107

Python简单GUI程序示例 中 “四、视频播放器” https://blog.youkuaiyun.com/cnds123/article/details/122903311

但是,一直不尽人意。现在,再介绍一个。

这是一个基于 PyQt6 和 python-vlc 开发的视频播放器,主要实现了我多次试图实现未果的功能

——带有播放进度条,不仅显示播放进度,还支持拖动播放位置跳转。

普通版视频播放器

主要特点

    播放画面随窗口缩放

    支持常见格式(MP4、AVI、MKV 等)

    通过文件对话框加载视频文件

    播放/暂停、停止、播放进度跳转、音量调节

    显示视频文件名、当前播放时间、总时长

播放进度条:显示播放进度并支持拖动播放位置跳转。

音量滑块:音量滑块调整音量大小。

需安装以下 Python第三方库:

python-vlc、 PyQt6

Windows中,还要安装 VLC 播放器,其下载 地址 https://www.videolan.org/vlc/ 。否则,将报错:缺少 libvlc.dll。

运行效果界面如下:

基本使用操作

    打开文件:点击菜单栏 文件 > 打开文件(快捷键 Ctrl+O) 或底部 打开文件 按钮

    播放/暂停:空格键 或 点击 按钮切换

    停止:停止 按钮   

    进度跳转:拖动进度条

    音量调节:拖动底部音量滑块

源码如下:

import sys
import time
import vlc
import os
from PyQt6 import QtWidgets, QtCore, QtGui

class VLCPlayer(QtWidgets.QMainWindow):
    def __init__(self):
        super().__init__()
        self.instance = vlc.Instance()
        self.player = self.instance.media_player_new()
        self.timer = QtCore.QTimer(self)
        self.timer.timeout.connect(self.update_ui)
        self.current_file = None
        self.media_loaded = False
        self.init_ui()

    def init_ui(self):
        # 主窗口设置
        self.setWindowTitle("PyQt6 VLC Player")
        self.resize(800, 600)

        # 创建菜单栏
        menubar = self.menuBar()
        file_menu = menubar.addMenu("文件(&F)")

        # 添加"打开"动作
        open_action = QtGui.QAction("打开文件...", self)
        open_action.setShortcut("Ctrl+O")
        open_action.triggered.connect(self.open_file)
        file_menu.addAction(open_action)

        # 创建主容器和布局
        central_widget = QtWidgets.QWidget(self)
        self.setCentralWidget(central_widget)
        main_layout = QtWidgets.QVBoxLayout(central_widget)
        main_layout.setContentsMargins(0, 0, 0, 0)

        # 视频标题标签 
        self.title_label = QtWidgets.QLabel("当前未选择媒体文件")
        self.title_label.setAlignment(QtCore.Qt.AlignmentFlag.AlignCenter)
        self.title_label.setStyleSheet("font-size: 14px; color: #666; margin: 5px;")
        main_layout.addWidget(self.title_label)
        
        # 视频显示区域
        self.video_widget = QtWidgets.QWidget()
        self.video_widget.setStyleSheet("background-color: black;")
        main_layout.addWidget(self.video_widget, stretch=1)

        # 控制面板
        control_panel = QtWidgets.QWidget()
        control_layout = QtWidgets.QVBoxLayout(control_panel)

        # 进度条
        self.progress_bar = QtWidgets.QSlider(QtCore.Qt.Orientation.Horizontal)
        self.progress_bar.setMinimum(0)
        self.progress_bar.sliderMoved.connect(self.set_position)
        control_layout.addWidget(self.progress_bar)

        # 时间标签
        self.time_label = QtWidgets.QLabel("00:00:00 / 00:00:00")
        control_layout.addWidget(self.time_label)

        # 控制按钮
        button_layout = QtWidgets.QHBoxLayout()
        self.play_btn = QtWidgets.QPushButton("播放")
        self.play_btn.clicked.connect(self.toggle_play)
        self.stop_btn = QtWidgets.QPushButton("停止")
        self.stop_btn.clicked.connect(self.stop)
        self.open_btn = QtWidgets.QPushButton("打开文件")
        self.open_btn.clicked.connect(self.open_file)
        
        # 音量控制
        self.volume_slider = QtWidgets.QSlider(QtCore.Qt.Orientation.Horizontal)
        self.volume_slider.setRange(0, 100)
        self.volume_slider.setValue(100)
        self.volume_slider.valueChanged.connect(self.set_volume)

        # 添加控件
        button_layout.addWidget(self.open_btn)
        button_layout.addWidget(self.play_btn)
        button_layout.addWidget(self.stop_btn)
        button_layout.addWidget(QtWidgets.QLabel("音量:"))
        button_layout.addWidget(self.volume_slider)
        control_layout.addLayout(button_layout)

        main_layout.addWidget(control_panel)

        # 设置VLC渲染
        if sys.platform == "win32":
            self.player.set_hwnd(int(self.vi
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

学习&实践爱好者

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值