from PyQt5.QtWidgets import *
from PyQt5.QtMultimedia import *
from PyQt5.QtGui import *
from PyQt5.QtCore import *
from PyQt5.QtMultimediaWidgets import QVideoWidget
from PyQt5 import QtCore, QtGui, QtWidgets
import sys
from PyQt5.QtCore import *
from PyQt5.QtWidgets import QSlider
from PyQt5.QtMultimediaWidgets import QVideoWidget
from PyQt5.QtCore import *
class myVideoWidget(QVideoWidget):
doubleClickedItem = pyqtSignal(str) # 创建双击信号
def __init__(self, parent=None):
super(QVideoWidget, self).__init__(parent)
def mouseDoubleClickEvent(self, QMouseEvent): #双击事件
self.doubleClickedItem.emit("double clicked")
class myVideoSlider(QSlider):
ClickedValue = pyqtSignal(int)
def __init__(self, father):
super().__init__(Qt.Horizontal, father)
def mousePressEvent(self, QMouseEvent): #单击事件
super().mousePressEvent(QMouseEvent)
value = QMouseEvent.localPos().x()
# self.setValue(int(value)/9)
value = round(value/self.width()*self.maximum()) # 根据鼠标点击的位置和slider的长度算出百分比
self.ClickedValue.emit(value)
class myMainWindow(QMainWindow):
def __init__(self):
super().__init__()
self.setupUi(self)
def setupUi(self, MainWindow):
MainWindow.setObjectName("MainWindow")
MainWindow.resize(615, 404)
self.centralwidget = QtWidgets.QWidget(MainWindow)
self.centralwidget.setObjectName("centralwidget")
self.gridLayout = QtWidgets.QGridLayout(self.centralwidget)
self.gridLayout.setObjectName("gridLayout")
self.wgt_video = myVideoWidget(self.centralwidget)
self.wgt_video.setMinimumSize(QtCore.QSize(410, 200))
self.wgt_video.setMaximumSize(QtCore.QSize(16777215, 16777215))
palette = QtGui.QPalette()
brush = QtGui.QBrush(QtGui.QColor(255, 255, 255))
brush.setStyle(QtCore.Qt.SolidPattern)
palette.setBrush(QtGui.QPalette.Active, QtGui.QPalette.Base, brush)
brush = QtGui.QBrush(QtGui.QColor(0, 0, 0))
brush.setStyle(QtCore.Qt.SolidPattern)
palette.setBrush(QtGui.QPalette.Active, QtGui.QPalette.Window, brush)
brush = QtGui.QBrush(QtGui.QColor(255, 255, 255))
brush.setStyle(QtCore.Qt.SolidPattern)
palette.setBrush(QtGui.QPalette.Inactive, QtGui.QPalette.Base, brush)
brush = QtGui.QBrush(QtGui.QColor(0, 0, 0))
brush.setStyle(QtCore.Qt.SolidPattern)
palette.setBrush(QtGui.QPalette.Inactive, QtGui.QPalette.Window, brush)
brush = QtGui.QBrush(QtGui.QColor(0, 0, 0))
brush.setStyle(QtCore.Qt.SolidPattern)
palette.setBrush(QtGui.QPalette.Disabled, QtGui.QPalette.Base, brush)
brush = QtGui.QBrush(QtGui.QColor(0, 0, 0))
brush.setStyle(QtCore.Qt.SolidPattern)
palette.setBrush(QtGui.QPalette.Disabled, QtGui.QPalette.Window, brush)
self.wgt_video.setPalette(palette)
self.wgt_video.setAutoFillBackground(True)
self.wgt_video.setObjectName("wgt_video")
self.gridLayout.addWidget(self.wgt_video, 0, 0, 1, 1)
self.sld_video = myVideoSlider(self.centralwidget)
self.sld_video.setMinimumSize(QtCore.QSize(410, 0))
self.sld_video.setMaximumSize(QtCore.QSize(16777215, 20))
self.sld_video.setMaximum(100)
self.sld_video.setOrientation(QtCore.Qt.Horizontal)
self.sld_video.setObjectName("sld_video")
self.gridLayout.addWidget(self.sld_video, 1, 0, 1, 1)
self.lab_video = QtWidgets.QLabel(self.centralwidget)
self.lab_video.setMaximumSize(QtCore.QSize(16777215, 50))
self.lab_video.setObjectName("lab_video")
self.gridLayout.addWidget(self.lab_video, 1, 1, 1, 1)
self.splitter = QtWidgets.QSplitter(self.centralwidget)
self.splitter.setOrientation(QtCore.Qt.Horizontal)
self.splitter.setObjectName("splitter")
self.btn_open = QtWidgets.QPushButton(self.splitter)
self.btn_open.setMaximumSize(QtCore.QSize(100, 25))
self.btn_open.setObjectName("btn_open")
self.btn_play = QtWidgets.QPushButton(self.splitter)
self.btn_play.setMaximumSize(QtCore.QSize(100, 25))
self.btn_play.setObjectName("btn_play")
self.btn_stop = QtWidgets.QPushButton(self.splitter)
self.btn_stop.setMaximumSize(QtCore.QSize(100, 25))
self.btn_stop.setObjectName("btn_stop")
self.sld_audio = QtWidgets.QSlider(self.splitter)
self.sld_audio.setMinimumSize(QtCore.QSize(100, 0))
self.sld_audio.setMaximumSize(QtCore.QSize(150, 20))
self.sld_audio.setProperty("value", 99)
self.sld_audio.setOrientation(QtCore.Qt.Horizontal)
self.sld_audio.setObjectName("sld_audio")
self.lab_audio = QtWidgets.QLabel(self.splitter)
self.lab_audio.setObjectName("lab_audio")
self.btn_cast = QtWidgets.QPushButton(self.splitter)
self.btn_cast.setObjectName("btn_cast")
self.gridLayout.addWidget(self.splitter, 2, 0, 1, 1)
MainWindow.setCentralWidget(self.centralwidget)
self.menubar = QtWidgets.QMenuBar(MainWindow)
self.menubar.setGeometry(QtCore.QRect(0, 0, 615, 23))
self.menubar.setObjectName("menubar")
MainWindow.setMenuBar(self.menubar)
self.statusbar = QtWidgets.QStatusBar(MainWindow)
self.statusbar.setObjectName("statusbar")
MainWindow.setStatusBar(self.statusbar)
QtCore.QMetaObject.connectSlotsByName(MainWindow)
self.lab_video.setText("0%")
self.btn_open.setText("打开视频文件")
self.btn_play.setText("播放")
self.btn_stop.setText("暂停")
self.lab_audio.setText("volume:100%")
self.btn_cast.setText("截图")
self.sld_video_pressed=False #判断当前进度条识别否被鼠标点击
self.videoFullScreen = False # 判断当前widget是否全屏
self.videoFullScreenWidget = myVideoWidget() # 创建一个全屏的widget
self.player = QMediaPlayer()
self.player.setVideoOutput(self.wgt_video) # 视频播放输出的widget,就是上面定义的
self.btn_open.clicked.connect(self.openVideoFile) # 打开视频文件按钮
self.btn_play.clicked.connect(self.playVideo) # play
self.btn_stop.clicked.connect(self.pauseVideo) # pause
self.btn_cast.clicked.connect(self.castVideo) # 视频截图
self.player.positionChanged.connect(self.changeSlide) # change Slide
self.videoFullScreenWidget.doubleClickedItem.connect(self.videoDoubleClicked) #双击响应
self.wgt_video.doubleClickedItem.connect(self.videoDoubleClicked) #双击响应
self.sld_video.setTracking(False)
self.sld_video.sliderReleased.connect(self.releaseSlider)
self.sld_video.sliderPressed.connect(self.pressSlider)
self.sld_video.sliderMoved.connect(self.moveSlider) # 进度条拖拽跳转
self.sld_video.ClickedValue.connect(self.clickedSlider) # 进度条点击跳转
self.sld_audio.valueChanged.connect(self.volumeChange) # 控制声音播放
self.btn_cast.hide()
def castVideo(self):
screen = QGuiApplication.primaryScreen()
cast_jpg = './'+QDateTime.currentDateTime().toString("yyyy-MM-dd hh-mm-ss-zzz")+'.jpg'
screen.grabWindow(self.wgt_video.winId()).save(cast_jpg)
def volumeChange(self, position):
volume= round(position/self.sld_audio.maximum()*100)
print("vlume %f" %volume)
self.player.setVolume(volume)
self.lab_audio.setText("volume:"+str(volume)+"%")
def clickedSlider(self, position):
if self.player.duration() > 0: # 开始播放后才允许进行跳转
video_position = int((position / 100) * self.player.duration())
self.player.setPosition(video_position)
self.lab_video.setText("%.2f%%" % position)
else:
self.sld_video.setValue(0)
def moveSlider(self, position):
self.sld_video_pressed = True
if self.player.duration() > 0: # 开始播放后才允许进行跳转
video_position = int((position / 100) * self.player.duration())
self.player.setPosition(video_position)
self.lab_video.setText("%.2f%%" % position)
def pressSlider(self):
self.sld_video_pressed = True
print("pressed")
def releaseSlider(self):
self.sld_video_pressed = False
def changeSlide(self, position):
if not self.sld_video_pressed: # 进度条被鼠标点击时不更新
self.vidoeLength = self.player.duration()+0.1
self.sld_video.setValue(round((position/self.vidoeLength)*100))
self.lab_video.setText("%.2f%%" % ((position/self.vidoeLength)*100))
def openVideoFile(self):
self.player.setMedia(QMediaContent(QFileDialog.getOpenFileUrl()[0])) # 选取视频文件
self.player.play() # 播放视频
print(self.player.availableMetaData())
def playVideo(self):
self.player.play()
def pauseVideo(self):
self.player.pause()
def videoDoubleClicked(self, text):
if self.player.duration() > 0: # 开始播放后才允许进行全屏操作
if self.videoFullScreen:
self.player.setVideoOutput(self.wgt_video)
self.videoFullScreenWidget.hide()
self.videoFullScreen = False
else:
self.videoFullScreenWidget.show()
self.player.setVideoOutput(self.videoFullScreenWidget)
self.videoFullScreenWidget.setFullScreen(1)
self.videoFullScreen = True
if __name__ == '__main__':
app = QApplication(sys.argv)
vieo_gui = myMainWindow()
vieo_gui.show()
sys.exit(app.exec_())