# -*- coding: utf-8 -*-
"""
基于Python实现播放本地视频文件
"""
# -------------------------------------- 引入依赖模块 --------------------------------------------------------------------
import sys
from PyQt5.QtGui import QIcon
from PyQt5.QtWidgets import QApplication, QMainWindow, QFileDialog, QMessageBox
from PyQt5 import QtGui, QtCore
from yanshi import MainUi
import cv2
global openFilepath, video_path
openFilepath = ''
video_path = ''
class MainCode(QMainWindow, MainUi.Ui_MainWindow): # MainUi为qt designer生成的主界面设计文件的.py文件
def __init__(self):
QMainWindow.__init__(self)
MainUi.Ui_MainWindow.__init__(self)
self.setupUi(self)
self.status = self.statusBar()
self.setWindowTitle('PythonGUI本地视频播放示例')
self.setWindowIcon(QIcon('../images/tubiao.png')) # 设置窗体标题图标
self.timer_camera = QtCore.QTimer() # 定义定时器,用于控制显示视频的帧率
self.btn_openvideo.clicked.connect(self.openVideofile) # 打开本地视频按钮函数
self.btn_bofang.clicked.connect(self.begin) # 开始播放按钮函数
def openVideofile(self):
global openFilepath, video_path
openFilepath = QFileDialog.getOpenFileName(self, '请选择文件', '')
print("选取的视频文件地址为:", openFilepath[0])
video_path = openFilepath[0]
self.cap = cv2.VideoCapture(video_path) # 读视频流
print(self.cap)
self.label_videopath.setText(str(video_path))
if openFilepath[0] is "":
md.alert('未读取本地视频文件!')
else:
video_path = ""
md.alert('已读取本地视频文件!')
def begin(self):
self.timer_camera.start(30) # 定时器开始计时30ms,结果是每过30ms从摄像头中取一帧显示
self.timer_camera.timeout.connect(self.showVideo) # 打开摆臂设置界面即调用show_camera()
def showVideo(self):
global video_path, openFilepath, flag
print(video_path)
if openFilepath is not "":
try:
flag, self.image = self.cap.read() # 从视频流中读取,BGR格式
global show, showImage
show = cv2.resize(self.image, (800, 400)) # 把读到的帧的大小重新设置为831, 411
show2 = cv2.cvtColor(show, cv2.COLOR_BGR2RGB) # 视频色彩转换回RGB,这样才是现实的颜色
showImage = QtGui.QImage(show2.data, show2.shape[1], show2.shape[0],
QtGui.QImage.Format_RGB888) # 把读取到的视频数据变成QImage形式
self.label_showVideo.setPixmap(QtGui.QPixmap.fromImage(showImage)) # 往显示视频的Label里 显示QImage
except Exception as e:
if openFilepath is "":
self.timer_camera.disconnect()
md.alert('连接视频路径不能为空!')
else:
pass
finally:
print('flag:', flag)
if flag is False:
print('放完一次了!')
self.label_showVideo.clear()
self.cap = cv2.VideoCapture(openFilepath[0]) # 读视频流
QApplication.processEvents()
else:
pass # 预留
def alert(self, message_alert):
self.box = QMessageBox(QMessageBox.Warning, "提示框", message_alert)
qyes = self.box.addButton(self.tr("确定"), QMessageBox.YesRole)
self.box.exec_()
# ---------------------------------------- 程序入口 -----------------------------------------------------------------
if __name__ == '__main__':
QtCore.QCoreApplication.setAttribute(QtCore.Qt.AA_EnableHighDpiScaling) # Qt从5.6.0开始,支持High-DPI
app = QApplication(sys.argv) # 应用程序对象初始化
md = MainCode() # 主界面别名
md.show() # 界面显示
sys.exit(app.exec_())
*猪耳朵*
- 粉丝: 5w+
- 资源: 56
最新资源
- 风光储、风光储并网直流微电网simulink仿真模型 系统由光伏发电系统、风力发电系统、混合储能系统(可单独储能
- 微环谐振腔的光学频率梳matlab仿真 微腔光频梳仿真 包括求解LLE方程(Lugiato-Lefever equation)实
- 51单片机温室大棚温湿度光照控制系统资料包括原理图,PCB文件,源程序,一些软件等,仿真文件 设计简介: (1)51单片机+D
- 033.2.3-选择21-25.sz
- FLAC3D蠕变模型 伯格斯模型
- UE5中的UV编辑:深入探索创建与编辑工具
- MySQL基础语法-空间数据类型.pdf
- 深入探索Oracle与MySQL在备份与恢复方面的显著差异
- SVM及其实践系列博文对应的数据和代码
- UE5中的网格体编辑与几何体编辑:深入指南与代码示例
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈
- 1
- 2
- 3
- 4
前往页