欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

qt视频播放器代码(vs下的qt视频播放功能)

程序员文章站 2024-03-27 13:05:28
一、引言在python-opencv中显示图像时调用的是一个单独的窗口,有时我们需要将这些图像显示在pyqt的图形化界面上,这样就可以将整个图像显示与pyqt图形化界面进行整合。但opencv格式的图...

一、引言

在python-opencv中显示图像时调用的是一个单独的窗口,有时我们需要将这些图像显示在pyqt的图形化界面上,这样就可以将整个图像显示与pyqt图形化界面进行整合。但opencv格式的图像和pyqt格式的图像并不同,这就需要进行转换。

二、背景知识

  1. python-opencv的图像是bgr格式的,而pyqt图像格式是rgb格式的,二者需要转换;
  2. 为了快速转换,图像必须基于内存进行操作;
  3. pyqt的qimage类可以从内存数组构建;
  4. opencv可以读取视频图像,使用waitkey可以实现休眠特定时长而不影响系统消息处理。

关于pyqt和opencv之间的图像转换请参考《python-opencv中图像颜色空间转换》。

三、案例

下面的案例读取一个视频文件的图像进行显示,如果再叠加一个音频播放的功能,就实现了一个视频播放器

3.1、设计图形化界面

qt视频播放器代码(vs下的qt视频播放功能)


该图形界面非常简单,包含了一个仅有“showimg”的菜单和对应工具栏,一个名为imgdisp的标签对象用于显示图像(蓝色标记部分)。使用pyuic生成的界面对象代码如下:

from pyqt5 import qtcore, qtgui, qtwidgets


class ui_mainwindow(object):
    def setupui(self, mainwindow):
        mainwindow.setobjectname("mainwindow")
        mainwindow.resize(625, 430)
        self.centralwidget = qtwidgets.qwidget(mainwindow)
        self.centralwidget.setobjectname("centralwidget")
        self.imgdisp = qtwidgets.qlabel(self.centralwidget)
        self.imgdisp.setgeometry(qtcore.qrect(0, 0, 54, 12))
        self.imgdisp.setobjectname("imgdisp")
        mainwindow.setcentralwidget(self.centralwidget)
        self.menubar = qtwidgets.qmenubar(mainwindow)
        self.menubar.setgeometry(qtcore.qrect(0, 0, 625, 17))
        self.menubar.setobjectname("menubar")
        self.menushowimg = qtwidgets.qmenu(self.menubar)
        self.menushowimg.setobjectname("menushowimg")
        mainwindow.setmenubar(self.menubar)
        self.statusbar = qtwidgets.qstatusbar(mainwindow)
        self.statusbar.setobjectname("statusbar")
        mainwindow.setstatusbar(self.statusbar)
        self.toolbar = qtwidgets.qtoolbar(mainwindow)
        self.toolbar.setobjectname("toolbar")
        mainwindow.addtoolbar(qtcore.qt.toptoolbararea, self.toolbar)
        self.actionshowimg = qtwidgets.qaction(mainwindow)
        self.actionshowimg.setobjectname("actionshowimg")
        self.menushowimg.addaction(self.actionshowimg)
        self.menubar.addaction(self.menushowimg.menuaction())
        self.toolbar.addaction(self.actionshowimg)

        self.retranslateui(mainwindow)
        qtcore.qmetaobject.connectslotsbyname(mainwindow)

    def retranslateui(self, mainwindow):
        _translate = qtcore.qcoreapplication.translate
        mainwindow.setwindowtitle(_translate("mainwindow", "mainwindow"))
        self.imgdisp.settext(_translate("mainwindow", "."))
        self.menushowimg.settitle(_translate("mainwindow", "menu"))
        self.toolbar.setwindowtitle(_translate("mainwindow", "toolbar"))
        self.actionshowimg.settext(_translate("mainwindow", "showimg"))

3.2、主程序

import cv2,sys
from pyqt5 import qtgui,qtwidgets,qtcore
import mainwin

def cvimgtoqtimg(cvimg): #定义opencv图像转pyqt图像的函数
    qtimgbuf = cv2.cvtcolor(cvimg,  cv2.color_bgr2bgra)

    qtimg = qtgui.qimage(qtimgbuf.data, qtimgbuf.shape[1], qtimgbuf.shape[0], qtgui.qimage.format_rgb32)
    
    return qtimg



class mainwin(qtwidgets.qmainwindow,mainwin.ui_mainwindow):
    def __init__(self):
        super().__init__()
        self.setupui(self)
        self.bclose = false

        self.actionshowimg.triggered.connect(self.playvideofile) #建立菜单点击的信号与方法playvideofile连接

    def playvideofile(self): #播放影片
        cap = cv2.videocapture(r'f:videomydream.mp4') #打开影片
        fps = 24
        if not cap.isopened():
            print("cannot open video file")
            exit()

        while not self.bclose:
            ret, frame = cap.read() #逐帧读取影片
            if not ret:
                if frame is none:
                    print("the video has end.")
                else:
                    print("read video error!")
                break

            qtimg = cvimgtoqtimg(frame)  #将帧数据转换为pyqt图像格式
            self.imgdisp.setpixmap(qtgui.qpixmap.fromimage(qtimg)) #在imgdisp显示图像
            size = qtimg.size() 
            self.imgdisp.resize(size)#根据帧大小调整标签大小
            self.imgdisp.show() #刷新界面
            cv2.waitkey(int(1000/fps)) #休眠一会,确保每秒播放fps帧

        # 完成所有操作后,释放捕获器
        cap.release()


if __name__=='__main__':
    app = qtwidgets.qapplication(sys.argv)
    w = mainwin()
    w.show()
    sys.exit(app.exec_())

注意:

本文的实现方法存在不足,相关完善方案请见《opencv-python图像转换为pyqt图像的变形及花屏问题研究》。

3.3、运行程序

初始界面

qt视频播放器代码(vs下的qt视频播放功能)

点击showimg,开始播放视频:

qt视频播放器代码(vs下的qt视频播放功能)

关于pyqt的使用请参考付费专栏《使用pyqt开发图形界面python应用》,专栏文件目录《使用pyqt开发图形界面python应用专栏目录》。

也可以参考免费专栏《pyqt入门知识》,专栏文件目录《使用pyqt进行python图形界面程序开发文章目录》。