PyQT-5 Multimedia

En este tutorial veremos el widget QMediaPlayer que podemos utilizar para la reproducción de archivos multimedia, audio y video, en esta ocasión crearemos un pequeño programa Python que nos permite visualizar un archivo de video, este archivo debe estar en alguno de los formatos de video soportado, AVI, por ejemplo.

Lo primero que haremos será crear un QVideoWidget, este es el widget que agregaremos a la interfaz gráfica de usuario y que contendrá al QMediaPlayer este último será el encargado de reproducir y controlar el archivo multimedia indicado.

class VideoPlayer(QWidget):

    def __init__(self, parent=None):
        super(VideoPlayer, self).__init__(parent)

        openButton = QPushButton("Buscar...")
        openButton.clicked.connect(self.openFile)

        self.playButton = QPushButton()
        self.playButton.setEnabled(False)
        self.playButton.setIcon(self.style().standardIcon(QStyle.SP_MediaPlay))
        self.playButton.clicked.connect(self.play)

        self.positionSlider = QSlider(Qt.Horizontal)
        self.positionSlider.setRange(0, 0)
        self.positionSlider.sliderMoved.connect(self.setPosition)

        controlLayout = QHBoxLayout()
        controlLayout.setContentsMargins(0, 0, 0, 0)
        controlLayout.addWidget(openButton)
        controlLayout.addWidget(self.playButton)
        controlLayout.addWidget(self.positionSlider)

        videoWidget = QVideoWidget()

        layout = QVBoxLayout()
        layout.addWidget(videoWidget)
        layout.addLayout(controlLayout)

        self.setLayout(layout)
        
        self.mediaPlayer = QMediaPlayer(None, QMediaPlayer.VideoSurface)
        self.mediaPlayer.setVideoOutput(videoWidget)
        self.mediaPlayer.stateChanged.connect(self.mediaStateChanged)
        self.mediaPlayer.positionChanged.connect(self.positionChanged)
        self.mediaPlayer.durationChanged.connect(self.durationChanged)

La clase VideoPlayer consta de un GUI muy simple tenemos un QVideoWidget para mostrar el video seleccionado por el usuario, este video es seleccionado utilizando el cuadro de búsqueda de archivos, también tenemos un botón que nos permite reproducir y pausar el video, para mostrar el avance de la reproducción usamos un QSlider horizontal, el usuario puede usar este control para modificar la posición de reproducción.

pyqt5 video

Los controles QPushButton, QSlider y el contenedor QVBoxLayout ya los hemos visto en tutoriales anteriores por lo que nos entraremos en detalles, el QVideoWidget lo agregamos a la GUI de la misma manera.

self.mediaPlayer = QMediaPlayer(None, QMediaPlayer.VideoSurface)
self.mediaPlayer.setVideoOutput(videoWidget)
self.mediaPlayer.stateChanged.connect(self.mediaStateChanged)
self.mediaPlayer.positionChanged.connect(self.positionChanged)
self.mediaPlayer.durationChanged.connect(self.durationChanged)

La primera línea de código crea el objeto mediaPlayer preparado para reproducir un video, en la segunda usamos el método setVideoOutpup para indicar el QVideoWidget donde se mostrará el video, las tres últimas líneas definen manejadores de eventos, para cuando cambia el estado de reproducción, la posición  y la duración del video.

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)

En el evento stateChanged verificamos el estado de reproducción mediante el método mediaPlayer.state(), si se esta reproduciendo cambiamos al icono de pausa y viceversa.

El evento positionChanged nos indica que la posición de reproducción a cambiado por lo que aprovechamos para mover la posición del QSlider, por otra parte durationChanged notifica el cambio en la duración del video, lo que hacemos es modificar el máximo valor del QSlider a este valor. 

def openFile(self):
    fileName, _ = QFileDialog.getOpenFileName(self, "Archivo de video", QDir.homePath())
    if fileName != '':
        self.mediaPlayer.setMedia(QMediaContent(QUrl.fromLocalFile(fileName)))
        self.playButton.setEnabled(True)

def play(self):
    if self.mediaPlayer.state() == QMediaPlayer.PlayingState:
        self.mediaPlayer.pause()
    else:
        self.mediaPlayer.play()

Al final presentamos el método openFile encargado de abrir el archivo de video, usamos mediaPlayer.setMedia(…) para indicarle al QMediaPlayer cual es el archivo que debe abrir, lo hacemos a través de la clase QMediaContent, esta requiere un objeto QUrl que creamos a partir de la ruta que ha seleccionado el usuario en el cuadro de dialogo.

El método play se encargar de reproducir y pausar el video usando los siguientes métodos de la clase QMediaPlayer: mediaPlayer.play() y mediaPlayer.pause().

Ver en GitHub: PyQT5 Reproducir Video

Comentarios

Entradas populares de este blog

Conectar SQL Server con Java

Detección de rostros

Instalar OpenCV para Python en Windows