Important: Please read the Qt Code of Conduct - https://forum.qt.io/topic/113070/qt-code-of-conduct

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
    Fênetre (2).png

    #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, join

    class 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.


Log in to reply