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>

三、运行效果

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/689982.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

林浩然与杨凌芸的Java List大冒险

林浩然与杨凌芸的Java List大冒险 Lin Haoran and Yang Lingyun’s Java List Adventure 在一个阳光明媚的日子&#xff0c;程序员界的“侠客”林浩然和他那聪明伶俐的同事兼好友杨凌芸正在Java王国里进行一场别开生面的大冒险。这次他们的目标是征服两个强大的List家族成员——…

c++面试

c基础 面试题 1&#xff1a;变量的声明和定义有什么区别 1.定义:为变量分配地址和存储空间&#xff0c;声明:不分配地址。 2.一个变量可以在多个地方声明&#xff0c;但是只在一个地方定义。 3.加入 extern 修饰的是变量的声明&#xff0c;说明此变量将在文件以外或在文件后…

备战蓝桥杯 Day4

目录 注意&#xff1a;递推开long long 1140&#xff1a;验证子串 1131&#xff1a;基因相关性 1176&#xff1a;谁考了第k名 1177&#xff1a;奇数单增序列 1180&#xff1a;分数线划定 1184&#xff1a;明明的随机数 1185&#xff1a;单词排序 1186&#xff1a;出现…

图论之dfs与bfs的练习

dfs--深度优选搜索 bfs--广度优先搜索 迷宫问题--dfs 问题&#xff1a; 给定一个n*m的二维迷宫数组其中S是起点&#xff0c;T是终点&#xff0c;*是墙壁&#xff08;无法通过&#xff09;&#xff0c; .是道路 问从起点S出发沿着上下左右四个方向走&#xff0c;能否走到T点&a…

视频监控需求八问:视频智能分析/视频汇聚平台EasyCVR有何特性?

最近TSINGSEE青犀视频在与业内伙伴进行项目合作的过程中&#xff0c;针对安防监控可视化视频管理系统EasyCVR视频融合平台在电信运营商项目中的应用&#xff0c;进行了多方面的项目需求沟通。今天我们就该项目沟通为案例&#xff0c;来具体了解一下用户关心度较高的关于视频智能…

4.函数模板的局限性

函数模板的通用性并不是万能的&#xff0c;我们自己人为定义的新的数据类型&#xff0c;模板不一定总能进行正确的识别与操作。 为了解决这个问题&#xff0c;我们可以利用具体化的模板&#xff0c;解决自定义类型的通用化。 #include<iostream> using namespace std;…

MySql报错:Statement violates GTID consistency: CREATE TABLE ... SELECT.解决

一 解决Statement violates GTID consistency: CREATE TABLE ... SELECT 问题&#xff1a; mysql在备份表时报错Statement violates GTID consistency: CREATE TABLE ... SELECT. CREATE TABLE tmp_fix0219 AS SELECT trade_no,ctime FROM charge_data_log 执行后&#xf…

【Linux】单机可建立的最大TCP连接数

【Linux】单机可建立的最大TCP连接数 背景介绍环境客户端服务端总结 背景 本文内容大多基于网上其他参考文章及资料整理后所得&#xff0c;并非原创&#xff0c;目的是为了需要时方便查看。 介绍 本文介绍Linux单机作为客户端或服务端时可建立的最大TCP连接数。 环境 分类…

LeetCode2560. House Robber IV——二分答案+动态规划

文章目录 一、题目二、题解 一、题目 There are several consecutive houses along a street, each of which has some money inside. There is also a robber, who wants to steal money from the homes, but he refuses to steal from adjacent homes. The capability of t…

CSS background-size

background-size 菜鸟教程 CSS3 background-size 属性 MDN Web 开发技术>CSS&#xff1a;层叠样式表>background-size CSS的background 背景图片自动适应元素大小,实现img的默认效果 background-size:100% 100%&#xff1b; 在CSS中&#xff0c;background-size属性用…

C++ 基础算法 快速排序

之前写过这道题的分享&#xff0c;但是比较粗糙&#xff0c;因此这里想系统记录一遍。 给定你一个长度为 n 的整数数列。 请你使用快速排序对这个数列按照从小到大进行排序。 并将排好序的数列按顺序输出。 输入格式 输入共两行&#xff0c;第一行包含整数 n 。 第二行包含…

SNMP——简单网络管理协议

Q 什么SNMP? A:SNMP是广泛应用于TCP/IP网络的网络管理标准协议&#xff0c;该协议能够支持网络管理系统&#xff0c;用以监测连接到网络上的设备是否有任何引起管理上关注的情况。SNMP采用轮询机制&#xff0c;提供最基本的功能集&#xff0c;适合小型、快速、低价格的环境使…

【Docker】dockerfile学习

目录 一、Dockerfile文件说明FROMRUNWORKDIRADDCOPYENV 二、例子解析三、构建Dockerfile实例&#xff08;FROM ubuntu:20.04&#xff09;部署一整套的系统和目标软件&#xff08;FROM python:3.7&#xff09;专注于Python应用的快速部署&#xff08;FROM ubuntu:20.04&#xff…

vue项目中下载静态资源里的pdf文件

1.把文件放在项目目录src/assets文件下 2.在项目是用a标签下载 <a:href"require(/assets/download.pdf)"download"使用说明.pdf"target"_blank"><img src"/assets/banner.png" class"bannerimg"/></a> 以…

【xv6-labs】02 Lab: system calls

GDB 如何启动gdb 启动 make CPUs1 qemu-gdb在另一个终端启动 gdb-multiarch kernel/kernel进入gdb后输入 target remote localhost:26000 GDB 的一些命令 shell clear # 清屏layout src # 显示源码layout regs # 显示寄存器layout split # 同时显示源码和寄存器backtrace #…

Transformer实战-系列教程15:DETR 源码解读2(整体架构:DETR类)

&#x1f6a9;&#x1f6a9;&#x1f6a9;Transformer实战-系列教程总目录 有任何问题欢迎在下面留言 本篇文章的代码运行界面均在Pycharm中进行 本篇文章配套的代码资源已经上传 点我下载源码 DETR 算法解读 DETR 源码解读1&#xff08;项目配置/CocoDetection类/ConvertCocoP…

什么是485远程水表?

485远程水表是一种利用RS485通信协议进行数据传输的智能水表&#xff0c;它具有远程读数、实时监控、数据存储等功能&#xff0c;为水资源管理和居民用水提供了便捷。在我国&#xff0c;随着物联网、大数据等技术的发展&#xff0c;485远程水表得到了广泛的应用&#xff0c;为智…

引领企业服务新篇章,纷享销客揽获4项大奖

近日&#xff0c;连接型CRM的开创者纷享销客&#xff0c;凭借其卓越的整体实力&#xff0c;分别荣获《互联网周刊》&eNet研究院“2023年度最佳企业服务产品奖”、携手盈建科荣获中国工业报社“数字化转型优秀案例”、入选产业家“2023产业数字化金铲奖”以及KVBrand“2023年…

BUUCTF第二十二、二十三题解题思路

第二十二题[WUSTCTF2020]level1 查壳 64位ELF文件&#xff0c;用64位IDA打开。 在函数界面可以看到一个“flag”&#xff0c;跟进该函数。 int __cdecl main(int argc, const char **argv, const char **envp) {int i; // [rsp4h] [rbp-2Ch]FILE *stream; // [rsp8h] [rbp-2…

Java项目中,值的对应问题

数据库表 实体类&#xff08;对应数据库的字段&#xff0c;可以驼峰命名&#xff09; 封装的查询方法sql List<Student> getAllStudents(String name,String studentId,Integer classId,String className); 这里的值一一对应。 在多表查询时&#xff0c;查询到的指定字段…