用python 制作视频播放器

1.环境准备

        首先安装好要涉及到的python第三方库,并把安装的PyQt5的相关文件路径放到环境变量中去。

pip install python-opencv
pip install PyQt5
pip install PyQt5-tools
pip install threading 
pip install PIL

#因为默认的官方源是国外的,如果没有配置源的话尽量使用-i参数来使用国内的源,不然会很慢
#常用国内源:
#阿里云 http://mirrors.aliyun.com/pypi/simple
#豆瓣 http://pypi.douban.com/simple
#清华大学 https://pypi.tuna.tsinghua.edu.cn/simple
#中国科学技术大学 http://pypi.mirrors.ustc.edu.cn/simple
#中国科技大学 https://pypi.mirrors.ustc.edu.cn/simple

#使用方式例如安装python-opencv:
pip install python-opencv -i http://pypi.douban.com/simple

        了解如何获取和设置opencv播放属性,熟悉opencv基本属性

#opencv的基本属性可通过以下方式设置或获取:

cap = cv2.VideoCapture(0,cv2.CAP_DSHOW)

#获取属性
cap.get(要获取的属性)

#设置属性
cap.set(要设置的属性,设置的值)

#opencv基本属性如下:

CV_CAP_PROP_POS_MSEC #视频文件的当前位置(以毫秒为单位)或视频捕获时间戳。

CV_CAP_PROP_POS_FRAMES #接下来要解码/捕获的帧的基于0的索引。

CV_CAP_PROP_POS_AVI_RATIO #视频文件的相对位置:0 - 电影的开始,1 - 电影的结尾。

CV_CAP_PROP_FRAME_WIDTH #视频流中帧的宽度。

CV_CAP_PROP_FRAME_HEIGHT #视频流中帧的高度。

CV_CAP_PROP_FPS #帧速率。

CV_CAP_PROP_FOURCC #编解码器的4字符代码。

CV_CAP_PROP_FRAME_COUNT #视频文件中的帧数。

CV_CAP_PROP_FORMAT #返回的Mat对象的格式 retrieve() 。

CV_CAP_PROP_MODE #指示当前捕获模式的特定于后端的值。

CV_CAP_PROP_BRIGHTNESS #图像的亮度(仅适用于相机)。

CV_CAP_PROP_CONTRAST #图像对比度(仅适用于相机)。

CV_CAP_PROP_SATURATION #图像的饱和度(仅适用于相机)。

CV_CAP_PROP_HUE #图像的色调(仅适用于相机)。

CV_CAP_PROP_GAIN #图像的增益(仅适用于相机)。

CV_CAP_PROP_EXPOSURE #曝光(仅适用于相机)。

CV_CAP_PROP_CONVERT_RGB #布尔标志,指示是否应将图像转换为RGB。

CV_CAP_PROP_WHITE_BALANCE_U #白平衡设置的U值(注意:目前仅支持DC1394 v 2.x后端)

CV_CAP_PROP_WHITE_BALANCE_V #白平衡设置的V值(注意:目前仅支持DC1394 v 2.x后端)

CV_CAP_PROP_RECTIFICATION #立体摄像机的整流标志(注意:目前仅支持DC1394 v 2.x后端)

CV_CAP_PROP_ISO_SPEED  #摄像机的ISO速度(注意:目前仅支持DC1394 v 2.x后端)

CV_CAP_PROP_BUFFERSIZE #存储在内部缓冲存储器中的帧数(注意:目前仅支持DC1394 v 2.x后端)

2.使用opencv来进行简单的打开摄像头或者播放视频操作

import cv2

cameraCapture = cv2.VideoCapture(0,cv2.CAP_DSHOW)
#第一个参数表示打开的摄像头编号,当要播放本地视频的时候应该填视频路径;
#第二个参数可省略,但是会报警告,这是因为现在的新系统默认设置的是CAP_MSMF导致的

#读取视频或摄像头
success, frame = cameraCapture.read()

while success:
    #读取键盘内容
    key = cv2.waitKey(1) & 0xff

    #当输入p的时候暂停播放,cv2.waitKey()内的参数为0时一直暂停直到输入其他字符;
    #                                       当大于0时表示暂停多久
    if key == ord("p"):
        cv2.waitKey(0)
    
    #当输入s时结束循环不再播放
    if key== ord("s"):
        break

    #翻转图像,通常摄像头的图像都是反的通过翻转恢复正常,视频播放可以把这个删了
    frame=cv2.flip(frame, 1)
    
    #显示图像,第一个参数为CV2窗口标题,第二个为从摄像头或视频中读取到的图像
    cv2.imshow('Test camera', frame)
    
    #继续读取视频或摄像头
    success, frame = cameraCapture.read()

#关闭窗口
cv2.destroyAllWindows()

#释放摄像头
cameraCapture.release()

3.PyQt5+opencv打开摄像头或播放视频

        界面框架先用QTdesigner来把框架拉好,为方便演示,随便拉了个框,然后qt转py,文件名为test.py,放在主文件CAP.py同路径下,代码如下:

# -*- coding: utf-8 -*-

# Form implementation generated from reading ui file 'test.ui'
#
# Created by: PyQt5 UI code generator 5.9.2
#
# WARNING! All changes made in this file will be lost!

from PyQt5 import QtCore, QtGui, QtWidgets

class Ui_MainWindow(object):
    def setupUi(self, MainWindow):
        MainWindow.setObjectName("MainWindow")
        MainWindow.resize(1277, 836)
        self.centralwidget = QtWidgets.QWidget(MainWindow)
        self.centralwidget.setObjectName("centralwidget")
        self.label = QtWidgets.QLabel(self.centralwidget)
        self.label.setGeometry(QtCore.QRect(180, 90, 800, 600))
        self.label.setObjectName("label")
        self.pushButton = QtWidgets.QPushButton(self.centralwidget)
        self.pushButton.setGeometry(QtCore.QRect(40, 110, 93, 28))
        self.pushButton.setObjectName("pushButton")
        self.pushButton_2 = QtWidgets.QPushButton(self.centralwidget)
        self.pushButton_2.setGeometry(QtCore.QRect(40, 190, 93, 28))
        self.pushButton_2.setObjectName("pushButton_2")
        MainWindow.setCentralWidget(self.centralwidget)
        self.menubar = QtWidgets.QMenuBar(MainWindow)
        self.menubar.setGeometry(QtCore.QRect(0, 0, 1277, 26))
        self.menubar.setObjectName("menubar")
        MainWindow.setMenuBar(self.menubar)
        self.statusbar = QtWidgets.QStatusBar(MainWindow)
        self.statusbar.setObjectName("statusbar")
        MainWindow.setStatusBar(self.statusbar)

        self.retranslateUi(MainWindow)
        QtCore.QMetaObject.connectSlotsByName(MainWindow)

    def retranslateUi(self, MainWindow):
        _translate = QtCore.QCoreApplication.translate
        MainWindow.setWindowTitle(_translate("MainWindow", "MainWindow"))
        self.label.setText(_translate("MainWindow", "TextLabel"))
        self.pushButton.setText(_translate("MainWindow", "start"))
        self.pushButton_2.setText(_translate("MainWindow", "stop"))

        将opencv获取到的图像在PyQt5的QLable中显示,并用QButton来控制视频的开始和暂停。文件名CAP.py

import cv2
import numpy as numpy
from PIL import *
import sys
from PyQt5.QtWidgets import *
from PyQt5.QtGui import *
from PyQt5.QtCore import *
from threading import *
from test_ui import Ui_MainWindow
import time

class initvedio(QMainWindow,Ui_MainWindow):
    def __init__(self,parent=None):
        super(initvedio,self).__init__(parent)
        self.setupUi(self)
        self.thstop=True   #令初始信号值为True表示视频未开始播放
        # pix = QPixmap("ui/face_label_1.png")
        # self.label.setPixmap(pix)    #设置QLabel显示的初始图像

        self.label.setScaledContents(True) #设置图像自适应QLabel大小

        self.pushButton.clicked.connect(self.start) #按键连接开始播放函数
        self.pushButton_2.clicked.connect(self.stop) #按键连接结束播放函数
        self.show() #显示界面

    def start(self):
        '''
        开一个线程控制视频开始播放
        '''
        self.thstop=False  #改变信号
        th=Thread(target=self.showcamre)
        th.start()

    def stop(self):
        '''
        开控制视频结束播放
        '''
        self.thstop=True   #恢复未播放状态
        time.sleep(1)
        # pix = QPixmap("ui/face_label_1.png")
        # self.label.setPixmap(pix)

    def SetPic(self,img):
        '''
        设置QLabel内容
        '''
        self.label.setPixmap(QPixmap.fromImage(img))

    def showcamre(self):

        cap=cv2.VideoCapture(0,cv2.CAP_DSHOW)

        #设置显示分辨率和FPS
        cap.set(cv2.CAP_PROP_FRAME_WIDTH,800)
        cap.set(cv2.CAP_PROP_FRAME_HEIGHT,600)
        cap.set (cv2.CAP_PROP_FPS,20)
        
        #如果摄像头是打开状态则一直播放
        while cap.isOpened():

            #信号状态为True则结束播放
            if self.thstop:
                return

            ret,frame=cap.read()
            if ret==False:
                continue

            #水平翻转
            frame=cv2.flip(frame,1)

            #opencv 默认图像格式是rgb qimage要使用BRG,这里进行格式转换,不然会变色
            frame=cv2.cvtColor(frame,cv2.COLOR_RGB2BGR)

            #mat-->qimage
            a=QImage(frame.data,frame.shape[1],frame.shape[0],QImage.Format_RGB888)
            self.SetPic(a)

if __name__=="__main__":
    app=QApplication(sys.argv)
    ex=initvedio()
    app.exec_()
  • 5
    点赞
  • 23
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值