使用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