当前位置: 首页 > news >正文

Vscode python pyside6 制作视频播放器

一、界面如下

包含控件 qcombox、qtablewidget、qpushbotton、qverticalslider

二、运行代码

media_player.py

import sysfrom PySide6 import QtWidgets
from PySide6.QtWidgets import *
from PySide6.QtMultimedia import *
from PySide6.QtMultimediaWidgets import QVideoWidget
from PySide6.QtCore import QTimer
#from PySide6.QtMultimedia import QMediaContent
from test_ui import Ui_MainWindow
import cv2 class MainWindow(QMainWindow):def __init__(self, parent = None) :super().__init__(parent)self.ui = Ui_MainWindow()#self.ui.tableWidget = QTableWidget()self.ui.setupUi(self)self.ui.tableWidget.setRowCount(6)self.ui.tableWidget.setColumnCount(1)self.i = 0self.list_i = 0self.maxValue = 1000self.timer = QTimer()self.video_name_t = []# 播放器self.player = QMediaPlayer()self.player.setVideoOutput(self.ui.wdt_camera)#self.ui.tableWidget = QTableWidget(1,6)# 按钮打开文件self.ui.btn_open.clicked.connect(self.openVideoFile)# 播放self.ui.btn_play.clicked.connect(self.playVideo)  # play# 暂停self.ui.btn_pause.clicked.connect(self.pauseVideo)  # pauseself.ui.btn_next.clicked.connect(self.playnextvideo) # next videoself.ui.btn_pre.clicked.connect(self.playpreviousvideo)def openVideoFile(self):#self.player.setMedia(QMediaContent(QFileDialog.getOpenFileUrl()[0]))#self.player.setSource(QUrl.fromLocalFile(QFileDialog.getOpenFileUrl()[0]))video_name = QFileDialog.getOpenFileName()[0]print(video_name)self.player.setSource(video_name)self.media_duration = get_duration_from_cv2(video_name)print(self.media_duration)if video_name not in self.video_name_t:self.video_name_t.append(video_name)item = QTableWidgetItem(video_name)item.setText(video_name)self.ui.tableWidget.setItem(0,self.i, item)self.i += 1self.ui.bar_slider.setMaximum(round(self.media_duration*10))self.time_count = 0self.player.play()self.timer.setInterval(100)self.timer.start()self.timer.timeout.connect(self.onTimerOut)#print(self.player.availableMetaData())def playVideo(self):self.player.play()self.ui.bar_slider.setMaximum(round(self.media_duration*10))#self.time_count = 0self.timer.setInterval(100)self.timer.start()self.timer.timeout.connect(self.onTimerOut)def pauseVideo(self):self.player.pause()self.timer.stop()def playnextvideo(self):if self.list_i < self.i-1:self.list_i += 1item = self.ui.tableWidget.item(self.list_i,0)video_name = item.text()#video_name = QFileDialog.getOpenFileName()[0]print(video_name)self.player.setSource(video_name)self.media_duration = get_duration_from_cv2(video_name)print(self.media_duration)self.ui.bar_slider.setMaximum(round(self.media_duration*10))self.time_count = 0self.player.play()self.timer.setInterval(100)self.timer.start()self.timer.timeout.connect(self.onTimerOut)def playpreviousvideo(self):if self.list_i > 0:self.list_i -= 1item = self.ui.tableWidget.item(self.list_i,0)video_name = item.text()#video_name = QFileDialog.getOpenFileName()[0]print(video_name)self.player.setSource(video_name)self.media_duration = get_duration_from_cv2(video_name)print(self.media_duration)self.ui.bar_slider.setMaximum(round(self.media_duration*10))self.time_count = 0self.player.play()self.timer.setInterval(100)self.timer.start()self.timer.timeout.connect(self.onTimerOut) def onTimerOut(self):#if self.player.playbackState()==self.player.isPlaying():#if self.player.duration()>0:self.time_count += 1print(self.time_count*0.1)#self.ui.bar_slider.setValue(round(self.player.position()*self.maxValue/self.media_duration))self.ui.bar_slider.setValue(round(self.time_count))m, s = divmod(round(self.time_count*0.1), 60)h, m = divmod(m, 60)self.ui.label.setText("%02d:%02d:%02d" % (h, m, s))if self.time_count == round(self.media_duration*10):self.timer.stop()self.time_count = 0def get_duration_from_cv2(filename):cap = cv2.VideoCapture(filename)if cap.isOpened():rate = cap.get(5)frame_num =cap.get(7)duration = frame_num/ratereturn durationreturn -1if __name__ == '__main__':app = QtWidgets.QApplication(sys.argv)win = MainWindow()win.setWindowTitle("视频播放器")win.show()app.exit(app.exec_())

test_ui.py

# -*- coding: utf-8 -*-################################################################################
## Form generated from reading UI file 'test.ui'
##
## Created by: Qt User Interface Compiler version 6.5.1
##
## WARNING! All changes made in this file will be lost when recompiling UI file!
################################################################################from PySide6.QtCore import (QCoreApplication, QDate, QDateTime, QLocale,QMetaObject, QObject, QPoint, QRect,QSize, QTime, QUrl, Qt)
from PySide6.QtGui import (QBrush, QColor, QConicalGradient, QCursor,QFont, QFontDatabase, QGradient, QIcon,QImage, QKeySequence, QLinearGradient, QPainter,QPalette, QPixmap, QRadialGradient, QTransform)
from PySide6.QtMultimediaWidgets import QVideoWidget
from PySide6.QtWidgets import (QApplication, QHeaderView, QLabel, QMainWindow,QMenuBar, QPushButton, QSizePolicy, QSlider,QStatusBar, QTableWidget, QTableWidgetItem, QWidget)class Ui_MainWindow(object):def setupUi(self, MainWindow):if not MainWindow.objectName():MainWindow.setObjectName(u"MainWindow")MainWindow.resize(800, 600)self.centralwidget = QWidget(MainWindow)self.centralwidget.setObjectName(u"centralwidget")self.wdt_camera = QVideoWidget(self.centralwidget)self.wdt_camera.setObjectName(u"wdt_camera")self.wdt_camera.setGeometry(QRect(220, 10, 511, 351))self.tableWidget = QTableWidget(self.centralwidget)if (self.tableWidget.columnCount() < 1):self.tableWidget.setColumnCount(1)__qtablewidgetitem = QTableWidgetItem()self.tableWidget.setHorizontalHeaderItem(0, __qtablewidgetitem)self.tableWidget.setObjectName(u"tableWidget")self.tableWidget.setGeometry(QRect(10, 10, 181, 361))self.bar_slider = QSlider(self.centralwidget)self.bar_slider.setObjectName(u"bar_slider")self.bar_slider.setGeometry(QRect(220, 400, 511, 22))self.bar_slider.setOrientation(Qt.Horizontal)self.label = QLabel(self.centralwidget)self.label.setObjectName(u"label")self.label.setGeometry(QRect(32, 400, 181, 20))self.btn_play = QPushButton(self.centralwidget)self.btn_play.setObjectName(u"btn_play")self.btn_play.setGeometry(QRect(350, 460, 51, 41))self.btn_pause = QPushButton(self.centralwidget)self.btn_pause.setObjectName(u"btn_pause")self.btn_pause.setGeometry(QRect(430, 460, 51, 41))self.btn_next = QPushButton(self.centralwidget)self.btn_next.setObjectName(u"btn_next")self.btn_next.setGeometry(QRect(510, 460, 41, 41))self.btn_pre = QPushButton(self.centralwidget)self.btn_pre.setObjectName(u"btn_pre")self.btn_pre.setGeometry(QRect(270, 460, 51, 41))self.btn_open = QPushButton(self.centralwidget)self.btn_open.setObjectName(u"btn_open")self.btn_open.setGeometry(QRect(600, 462, 61, 41))MainWindow.setCentralWidget(self.centralwidget)self.menubar = QMenuBar(MainWindow)self.menubar.setObjectName(u"menubar")self.menubar.setGeometry(QRect(0, 0, 800, 21))MainWindow.setMenuBar(self.menubar)self.statusbar = QStatusBar(MainWindow)self.statusbar.setObjectName(u"statusbar")MainWindow.setStatusBar(self.statusbar)self.retranslateUi(MainWindow)QMetaObject.connectSlotsByName(MainWindow)# setupUidef retranslateUi(self, MainWindow):MainWindow.setWindowTitle(QCoreApplication.translate("MainWindow", u"MainWindow", None))___qtablewidgetitem = self.tableWidget.horizontalHeaderItem(0)___qtablewidgetitem.setText(QCoreApplication.translate("MainWindow", u"\u6587\u4ef6\u5217\u8868", None));self.label.setText(QCoreApplication.translate("MainWindow", u"\u65f6\u95f4\u663e\u793a", None))self.btn_play.setText(QCoreApplication.translate("MainWindow", u"\u64ad\u653e", None))self.btn_pause.setText(QCoreApplication.translate("MainWindow", u"\u6682\u505c", None))self.btn_next.setText(QCoreApplication.translate("MainWindow", u"\u4e0b\u4e00\u4e2a", None))self.btn_pre.setText(QCoreApplication.translate("MainWindow", u"\u4e0a\u4e00\u4e2a", None))self.btn_open.setText(QCoreApplication.translate("MainWindow", u"\u6253\u5f00\u6587\u4ef6", None))# retranslateUi

test.ui

<?xml version="1.0" encoding="UTF-8"?>
<ui version="4.0"><class>MainWindow</class><widget class="QMainWindow" name="MainWindow"><property name="geometry"><rect><x>0</x><y>0</y><width>800</width><height>600</height></rect></property><property name="windowTitle"><string>MainWindow</string></property><widget class="QWidget" name="centralwidget"><widget class="QVideoWidget" name="wdt_camera" native="true"><property name="geometry"><rect><x>220</x><y>10</y><width>511</width><height>351</height></rect></property></widget><widget class="QTableWidget" name="tableWidget"><property name="geometry"><rect><x>10</x><y>10</y><width>181</width><height>361</height></rect></property><column><property name="text"><string>文件列表</string></property></column></widget><widget class="QSlider" name="bar_slider"><property name="geometry"><rect><x>220</x><y>400</y><width>511</width><height>22</height></rect></property><property name="orientation"><enum>Qt::Horizontal</enum></property></widget><widget class="QLabel" name="label"><property name="geometry"><rect><x>32</x><y>400</y><width>181</width><height>20</height></rect></property><property name="text"><string>时间显示</string></property></widget><widget class="QPushButton" name="btn_play"><property name="geometry"><rect><x>350</x><y>460</y><width>51</width><height>41</height></rect></property><property name="text"><string>播放</string></property></widget><widget class="QPushButton" name="btn_pause"><property name="geometry"><rect><x>430</x><y>460</y><width>51</width><height>41</height></rect></property><property name="text"><string>暂停</string></property></widget><widget class="QPushButton" name="btn_next"><property name="geometry"><rect><x>510</x><y>460</y><width>41</width><height>41</height></rect></property><property name="text"><string>下一个</string></property></widget><widget class="QPushButton" name="btn_pre"><property name="geometry"><rect><x>270</x><y>460</y><width>51</width><height>41</height></rect></property><property name="text"><string>上一个</string></property></widget><widget class="QPushButton" name="btn_open"><property name="geometry"><rect><x>600</x><y>462</y><width>61</width><height>41</height></rect></property><property name="text"><string>打开文件</string></property></widget></widget><widget class="QMenuBar" name="menubar"><property name="geometry"><rect><x>0</x><y>0</y><width>800</width><height>21</height></rect></property></widget><widget class="QStatusBar" name="statusbar"/></widget><customwidgets><customwidget><class>QVideoWidget</class><extends>QWidget</extends><header>PyQt5.QtMultimediaWidgets</header><container>1</container></customwidget></customwidgets><resources/><connections/>
</ui>

三、运行效果

相关文章:

Vscode python pyside6 制作视频播放器

一、界面如下 包含控件 qcombox、qtablewidget、qpushbotton、qverticalslider 二、运行代码 media_player.py import sysfrom PySide6 import QtWidgets from PySide6.QtWidgets import * from PySide6.QtMultimedia import * from PySide6.QtMultimediaWidgets import QVi…...

纯前端低代码平台demo,vue框架,nodejs,简单的pm2纯前端部署实践

文章目录 目录结构说明本地运行项目启动后的页面demo前端部署打包pm2nginx 后话 前段时间开发了一个纯前端的低代码平台demo&#xff0c;vue框架&#xff0c;nodejs&#xff0c;pm2纯前端部署实践。为此记录一下开发过程以及各方面遇到的问题&#xff0c;并作说明。 表单用了若…...

致创新者:聚焦目标,而非问题

传统的企业创新管理方式常常导致组织内部策略不协调、流程低效、创新失败率高等问题。而创新运营作为企业管理创新的新模式&#xff0c;通过整合文化、实践、人员和工具&#xff0c;提高组织创新能力。已经采用创新运营的公司报告了一系列积极的结果&#xff0c;如市场推出速度…...

javaSE和javaEE区别

javaSE Java SE&#xff08;Java Platform&#xff0c;Standard Edition&#xff09; Java SE 以前称为 J2SE。 它允许开发和部署在桌面、服务器、嵌入式环境和实时环境中使用的 Java 应用程序。 Java SE 包含了支持 Java Web服务开发的类&#xff0c;并为 Java Platform&#…...

安装VMware+安装Linux

以上就是VMware在安装时的每一步操作&#xff0c;基本上就是点击 "下一步" 一直进行安装 安装Linux VMware虚拟机安装完毕之后&#xff0c;我们就可以打开VMware&#xff0c;并在上面来安装Linux操作系统。具体步骤如下&#xff1a; 1). 选择创建新的虚拟机 2). 选…...

session和cookie理解

目录 1、理解无状态 2、Session和Cookie理论 3、使用session存储数据 前言&#xff0c;理解session与cookie对于我们做web测试、接口测试、性能测试都是非常有帮助的。 cookie是一些数据信息&#xff0c;存储在浏览器端。 session是存储于服务器端的特殊对象&#xff0c;服务器…...

Springboot医院信息管理系统源码 带电子病历和LIS Saas应用+前后端分离+B/S架构

目录 系统特点 技术架构 系统功能 1、 标准数据维护 2、 收费&#xff08;门诊/住院&#xff09;系统 3、 药剂管理系统 4、 医生工作站系统 5、 护士工作站系统 6、电子病历系统 系统优点 云HIS系统简介 云HIS系统功能模块 门急诊挂号管理 门诊收费管理 门诊医…...

LeetCode.589. N 叉树的前序遍历

题目 589. N 叉树的前序遍历 分析 我们之前有做过LeetCode的 144. 二叉树的前序遍历&#xff0c;其实对于 N 插树来说和二叉树的思路是一模一样的。 二叉树的前序遍历是【根 左 右】 N叉树的前序遍历顺序是【根 孩子】&#xff0c;你可以把二叉树的【根 左 右】想象成【根 孩…...

C++ Webserver从零开始:配置环境(九)——下载github的项目进行测试

前言 大家好&#xff0c;我又来更新Webserver的博客了。上一次更新这个专栏时2024.2.5号&#xff0c;离现在已经13天了。非常抱歉&#xff0c;中间隔了那么久。一方面是基础知识学完之后&#xff0c;就要开始自己写代码了。看基础知识和写代码是两回事&#xff0c;理论和实践的…...

2024前端面试准备之TypeScript篇(一)

全文链接 1. 什么是TypeScript TypeScript是一种开源的编程语言,是JavaScript的一个超集。它添加了静态类型、类、接口和模块等特性,使得开发者能够更好地组织和维护大型应用程序。TypeScript代码可以被编译成JavaScript,从而可以在任何支持JavaScript的环境中运行。 2. …...

kali无线渗透之蓝牙攻击与原理

原理 蓝牙网络中的“个人身份码”攻击传统的蓝牙设备&#xff0c;主要是指“蓝牙规范2.1版”以前的各版蓝牙设备&#xff0c;以及使用“安全简化配对”(Secure SimplePairing&#xff0c;SSP)协议的蓝牙设备。 这些传统的蓝牙设备仅仅依赖于“个人身份码”( Personalldentifi…...

【开源】基于JAVA+Vue+SpringBoot的就医保险管理系统

目录 一、摘要1.1 项目介绍1.2 项目录屏 二、功能模块2.1 科室档案模块2.2 医生档案模块2.3 预约挂号模块2.4 我的挂号模块 三、系统展示四、核心代码4.1 用户查询全部医生4.2 新增医生4.3 查询科室4.4 新增号源4.5 预约号源 五、免责说明 一、摘要 1.1 项目介绍 基于JAVAVue…...

德国vetter krantechnik起重机安装操作和维护说明包含电路图装配图

德国vetter krantechnik起重机安装操作和维护说明包含电路图装配图...

怎样解决恢复VPS数据信息?

对于服务器来说其中的数据信息是十分重要的内容&#xff0c;一旦出现数据丢失或损坏&#xff0c;就会对企业造成巨大的损失&#xff0c;所以备份是非常重要的&#xff0c;那么在使用VPS时我们怎样能够恢复其中的数据信息呢&#xff1f; 一、手动备份 其中比较简单快速的备份方…...

OpenAI最新模型Sora到底有多强?眼见为实的真实世界即将成为过去!

文章目录 1. 写在前面2. 什么是Sora&#xff1f;3. Sora的技术原理 【作者主页】&#xff1a;吴秋霖 【作者介绍】&#xff1a;Python领域优质创作者、阿里云博客专家、华为云享专家。长期致力于Python与爬虫领域研究与开发工作&#xff01; 【作者推荐】&#xff1a;对JS逆向感…...

Qt的基本操作

文章目录 1. Qt Hello World 程序1.1 通过图形化界面的方式1.2 通过代码的方式实现 2. Qt 的编码问题3. 使用输入框实现hello world4. 使用按钮实现hello world5. Qt 编程注意事项6. 查询文档的方式7. 认识Qt坐标系 1. Qt Hello World 程序 1.1 通过图形化界面的方式 我们先讲…...

信号系统之数据压缩

1 数据压缩策略 表 27-1 显示了对数据压缩算法进行分类的两种不同方法。在(a)中&#xff0c;这些方法被归类为无损或有损(lossless or loss)。无损技术意味着恢复的数据文件与原始文件相同。这对于许多类型的数据是绝对必要的&#xff0c;例如&#xff1a;可执行代码、文字处理…...

第二篇【传奇开心果微博系列】Python微项目技术点案例示例:成语接龙游戏

传奇开心果微博系列 系列微博目录Python微项目技术点案例示例系列 微博目录一、微项目目标二、雏形示例代码三、扩展整体思路四、玩家输入示例代码五、成语判断示例代码六、回答判断示例代码七、电脑判断示例代码八、游戏结束示例代码九、界面优化示例代码十、扩展成语库示例代…...

国内AI大模型主要有哪些

ChatGPT火爆后不到一个月的时间&#xff0c;阿里、华为、腾讯、京东、字节、360、商汤、科大讯飞等大厂纷纷下场&#xff0c;或官宣入场或亮相大模型。我国对生成式AI实行监管的正式法规主要是2023年8月正式施行的《生成式人工智能服务管理暂行办法》。 据不完全统计&#xff…...

RabbitMQ保证消息的可靠性

1. 问题引入 消息从发送&#xff0c;到消费者接收&#xff0c;会经理多个过程&#xff1a; 其中的每一步都可能导致消息丢失&#xff0c;常见的丢失原因包括&#xff1a; 发送时丢失&#xff1a; 生产者发送的消息未送达exchange消息到达exchange后未到达queue MQ宕机&…...

EASY-HWID-SPOOFER:3分钟学会硬件信息伪装终极指南

EASY-HWID-SPOOFER&#xff1a;3分钟学会硬件信息伪装终极指南 【免费下载链接】EASY-HWID-SPOOFER 基于内核模式的硬件信息欺骗工具 项目地址: https://gitcode.com/gh_mirrors/ea/EASY-HWID-SPOOFER 在当今数字时代&#xff0c;您的硬件标识就像是设备的"数字指纹…...

DeepXDE终极指南:如何用科学机器学习轻松求解物理方程

DeepXDE终极指南&#xff1a;如何用科学机器学习轻松求解物理方程 【免费下载链接】deepxde A library for scientific machine learning and physics-informed learning 项目地址: https://gitcode.com/gh_mirrors/de/deepxde DeepXDE是一款革命性的开源科学机器学习库…...

抖音下载器终极指南:3分钟学会无损音频提取与批量下载

抖音下载器终极指南&#xff1a;3分钟学会无损音频提取与批量下载 【免费下载链接】douyin-downloader A practical Douyin downloader for both single-item and profile batch downloads, with progress display, retries, SQLite deduplication, and browser fallback suppo…...

Poppins字体终极指南:免费获取9种字重+天城文支持的多语言解决方案

Poppins字体终极指南&#xff1a;免费获取9种字重天城文支持的多语言解决方案 【免费下载链接】Poppins Poppins, a Devanagari Latin family for Google Fonts. 项目地址: https://gitcode.com/gh_mirrors/po/Poppins 还在为多语言项目寻找完美的字体吗&#xff1f;Po…...

中国车牌生成器:5分钟快速创建逼真车牌图像的终极指南

中国车牌生成器&#xff1a;5分钟快速创建逼真车牌图像的终极指南 【免费下载链接】chinese_license_plate_generator 中国车牌生成器 项目地址: https://gitcode.com/gh_mirrors/ch/chinese_license_plate_generator 在计算机视觉和AI识别系统开发中&#xff0c;获取高…...

如何快速掌握茉莉花插件:Zotero中文文献管理的完整实践指南

如何快速掌握茉莉花插件&#xff1a;Zotero中文文献管理的完整实践指南 【免费下载链接】jasminum A Zotero add-on to retrive CNKI meta data. 一个简单的Zotero 插件&#xff0c;用于识别中文元数据 项目地址: https://gitcode.com/gh_mirrors/ja/jasminum 还在为Zot…...

Windows远程桌面免费解锁指南:家庭版也能享受多用户并发连接

Windows远程桌面免费解锁指南&#xff1a;家庭版也能享受多用户并发连接 【免费下载链接】rdpwrap RDP Wrapper Library 项目地址: https://gitcode.com/gh_mirrors/rd/rdpwrap 你是否曾经因为Windows家庭版无法使用远程桌面而烦恼&#xff1f;或者需要多人同时访问同一…...

强化学习入门ⅡCS188 Note10 学习笔记

更好的阅读体验 Approximate Q-learning Q-learning虽然很有优势&#xff0c;但是缺乏了泛化能力。当pacman学习了figure1中的困境后&#xff0c;智能体是不会意识到figure2,figure3中的情景和figure1中的困境基本一样 所以说Q-Learning很有局限性&#xff0c;这时候该算法…...

别再忍受模糊界面了!Windows 10/11下拯救老旧软件的DPI兼容性设置保姆级教程

高分辨率屏幕救星&#xff1a;彻底解决Windows老旧软件显示模糊的终极指南当你在4K显示器上打开心爱的老版Photoshop时&#xff0c;那些本该清晰的工具栏图标却像被打了马赛克&#xff1b;运行经典游戏时&#xff0c;界面文字错位得像是抽象艺术——这不是你的电脑出了问题&…...

深入理解Java String不可变性

前言 在现代软件开发中&#xff0c;深入理解Java String不可变性是一个非常重要的技术点。本文将从原理到实践&#xff0c;带你深入理解这一技术&#xff0c;并通过完整的代码示例帮助你快速掌握核心知识点。 核心概念 基本原理 深入理解Java String不可变性的核心在于理解其底…...