Affichage de l'image courrante de la vidéo dans la fénêtre d'en dessous
-
Bonsoir,
je suis débutant en qt et je rencontre des problème lors de la réalisation de mon interface Qt avec utilisation de mediaplayer. Je souhaite réaliser une interface qui lit une vidéo et qui affiche dans la fenêtre en dessous (sous le label image), l'image de la vidéo quand celle ci est statique.(quand on appuie sur pause ou on se déplace avec le slider de la video). J'ai déja réussi en lire la vidéo mais je suis complètement perdu pour l'affichage video. pouvez vous m'aider s'il vous plait?
voici la capture d'écran de mon interface et mon code suit. Merci d'avance pour votre aide.
Interface
#import pyqtgraph.examples
#pyqtgraph.examples.run()from PIL import Image
import matplotlib
from PyQt5.QtGui import *
from PyQt5.QtWidgets import *
from PyQt5.QtCore import *
from PyQt5.QtMultimedia import *
from PyQt5.QtMultimediaWidgets import QVideoWidget
from PyQt5.QtMultimediaWidgets import *
import os,sys
import time
import pandas as pd
import numpy as np
NameOfVideo1= "Video"
NameOfVideo2= "Frame"
from mainwindow import * # fichier obtenu à partir QtDesigner et pyuic5
from PyQt5 . uic import loadUiType
import pyqtgraph as pg
from os.path import isfile, joinclass Main ( QMainWindow , Ui_MainWindow, ) :
def init ( self , *args, **kwargs ) :
super ( Main , self ) . init (*args, **kwargs )
self . setupUi ( self )
self . fig_dict = { }#create mediaplayer object
self.mediaPlayer = QMediaPlayer()
# Partie Mediaplayer
#create Name label
self.label = QLabel(self)
self.horizontalLayout_2.addWidget(self.label)
self.TopVideoName.setText( NameOfVideo1)
self.BottomVideoName.setText( NameOfVideo2)
#create button for playing
videoWidget=QVideoWidget()
self.playButton = QPushButton()
self.playButton.setEnabled(False)
self.playButton.setIcon(self.style().standardIcon(QStyle.SP_MediaPlay))
self.open()
self.playButton.clicked.connect(self.play)
#ajout image widget
#self.horizontalLayout_2.addWidget(self.image_frame)#create slider self.positionSlider = QSlider(Qt.Horizontal) self.positionSlider.setRange(0, 0) self.positionSlider.sliderMoved.connect(self.setPosition) self.errorLabel = QLabel() self.errorLabel.setSizePolicy(QSizePolicy.Preferred,QSizePolicy.Maximum) # Create layouts to place inside widget top self.horizontalLayout_5.setContentsMargins(0, 0, 0, 0) self.horizontalLayout_5.addWidget(self.playButton) self.horizontalLayout_5.addWidget(self.positionSlider) self.horizontalLayout_3.addWidget(videoWidget) self.horizontalLayout_5.addWidget(self.errorLabel) self.mediaPlayer.setVideoOutput(videoWidget) self.mediaPlayer.stateChanged.connect(self.mediaStateChanged) self.mediaPlayer.positionChanged.connect(self.positionChanged) self.mediaPlayer.durationChanged.connect(self.durationChanged) self.mediaPlayer.error.connect(self.handleError) def open(self): pathIn= 'VIDEO/' #load images files = [f for f in os.listdir(pathIn) if isfile(join(pathIn, f))] files.sort(key = lambda x: int(x[6:-4])) #for i in range(len(files)): filename=pathIn + files[0] self.mediaPlayer.setMedia(QMediaContent(QUrl.fromLocalFile(filename))) self.playButton.setEnabled(True) directory = r'C:\Users\PC\Desktop\Interface' os.chdir(directory) def play(self): if self.mediaPlayer.state() == QMediaPlayer.PlayingState: self.mediaPlayer.pause() else: self.mediaPlayer.play() def mediaStateChanged(self, state): if self.mediaPlayer.state() == QMediaPlayer.PlayingState: self.playButton.setIcon(self.style().standardIcon(QStyle.SP_MediaPause)) else: self.playButton.setIcon( self.style().standardIcon(QStyle.SP_MediaPlay)) def positionChanged(self, position): self.positionSlider.setValue(position) def durationChanged(self, duration): self.positionSlider.setRange(0, duration) def setPosition(self, position): self.mediaPlayer.setPosition(position) def handleError(self): self.playButton.setEnabled(False) self.errorLabel.setText("Error: " + self.mediaPlayer.errorString()) def updatePlot(self): self.Graph2.setXRange(*self.lr.getRegion(), padding=0) MinRegion,MaxRegion = (self.lr.getRegion()) def updateRegion(self): self.lr.setRegion(self.Graph2.getViewBox().viewRange()[0])
if name == 'main' :
import sys
from PyQt5 import QtGui
import numpy as np
app = QApplication(sys.argv)
main = Main ( )main . show ( ) sys . exit ( app . exec_ ( ) )
-
Votre code est un peu illisible dans votre poste.
J'y connais pas grand chose en python mais en C++, je vois 2 moyens de faire ça. Ces méthodes sont probablement utilisables en python également.
1/ Faire une copie d'écran du videowidget:
auto pix= m_ui->m_view->grab(rect); label->setImage(pix); // une convertion entre qpixmap qimage sera peut-être necessaire
2/ Faire un 2eme viewer video mais controllable en soft et le faire pauser au meme temps que le 1er.