当前位置: 首页 > 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宕机&…...

【工作实践-02】实验室移动端—跳转页面及交互

一、跳转页面不关闭当前页&#xff0c;与uniapp头部导航栏的返回按钮效果相似 uni.navigateBack({delta: 1}) 二、返回页面并刷新 1. 返回上一页时重新获取列表(调用上一页面获取列表方法) let pages getCurrentPages(); // 当前页面let beforePage pages[pages.length - 2…...

HTTP 请求 400错误

问题 HTTP 请求 400错误 详细问题 客户端发送请求 public static UserInfo updateUserInfo(UserInfo userInfo) {// 创建 OkHttpClient 对象OkHttpClient client new OkHttpClient();// 创建请求体MediaType JSON MediaType.parse("application/json; charsetutf-8&…...

C语言---指针进阶

1.字符指针 int main() {char str1[] "hello world";char str2[] "hello world";const char* str3 "hello world.";const char* str4 "hello world.";if (str3 str4){//常量字符串在内存里面是无法修改的&#xff0c;所以没必要…...

QT-通信编码格式问题

这里写目录标题 一、项目场景1.QT客户端与服务端通信时&#xff0c;转化步骤如下&#xff1a;2.原数据示例3.转化后数据 二、问题描述1.采用Soap协议2.采用HTTP协议 三、原因分析四、解决方案 一、项目场景 1.QT客户端与服务端通信时&#xff0c;转化步骤如下&#xff1a; 1&…...

一文了解Web3.0真实社交先驱ERA

Web2时代&#xff0c;少数科技巨头垄断了全球近60亿人口的网络社交数据&#xff0c;并用之为自己牟利&#xff0c;用户无法掌控个人数据&#xff0c;打破该局面逐渐成为共识&#xff0c;于是&#xff0c;不少人看到了Web3社交赛道蕴含的巨大机遇&#xff0c;标榜着去中心化和抗…...

微前端(qiankun)vue3+vite

目录 一、什么是微前端 二、主应用接入 qiankun 1.按照qiankun插件 2.注册微应用引用 3.挂载容器 三、微应用接入 qiankun 1.vite.config.ts 2.main.ts ps&#xff1a;手动加载微应用方式 ps&#xff1a;为什么不用 iframe 一、什么是微前端 微前端是一种多个团队通过独…...

根据Ruoyi做二开

Ruoyi二开 前言菜单代码生成新建微服务网关添加微服务的路由 vue页面和对应的js文件js中方法的url和controller中方法的url总结 前言 之前写过一篇文章&#xff0c;若依微服务版本搭建&#xff0c;超详细&#xff0c;就介绍了怎么搭建若依微服务版本&#xff0c;我们使用若依就…...

DockerFile的应用

DockerFile的应用 一、介绍1 构建的三步骤2 构建的过程 二、常用命令三、DockerFile案例1 创建DockerFile文件2 使用DockerFile文件构建镜像3 启动容器并验证 四 DockerFile添加数据卷 一、介绍 DockerFile是用来构建Docker镜像的构建文件&#xff0c;是由一系列命令和参数构成…...

爬虫入门一

文章目录 一、什么是爬虫&#xff1f;二、爬虫基本流程三、requests模块介绍四、requests模块发送Get请求五、Get请求携带参数六、携带请求头七、发送post请求八、携带cookie方式一&#xff1a;放在请求头中方式二&#xff1a;放在cookie参数中 九、post请求携带参数十、模拟登…...

2024-02-16 web3-区块链-keypass记录

摘要: 2024-02-16 web3-区块链-keypass记录 文档&#xff1a; Introduction - Keypass Docs What is KEYPASS&#xff1f; - Keypass Docs What is KEYPASS&#xff1f; KeyPass Wallet is a new smart contract wallet that provides a secure and customizable registration…...