Search code examples
pythonpyqtpyqt5vlc

Vlc player inside QFrame


I would like to put the VLC video player inside a frame. every time I run it it opens in a new window how can I put it inside the frame

here is the code

import sys

import os.path

from PyQt5.QtCore import Qt, QTimer

from PyQt5.QtGui import QPalette, QColor

from PyQt5.QtWidgets import QMainWindow, QWidget, QFrame, QSlider, QHBoxLayout, QPushButton, \
    QVBoxLayout, QAction, QFileDialog, QApplication

import vlc

from PyQt5 import QtCore, QtGui, QtWidgets

class Player(QMainWindow):


    def __init__(self, master=None):

        QMainWindow.__init__(self, master)

        self.setWindowTitle("Media Player")

        # creating a basic vlc instance

        self.instance = vlc.Instance()

        # creating an empty vlc media player

        self.mediaplayer = self.instance.media_player_new()

        self.isPaused = False



         ##########video frame

        self.videoframe = QFrame(self)

        self.videoframe.setGeometry(QtCore.QRect(210, 70, 391, 291))

        self.videoframe.setFrameShape(QtWidgets.QFrame.Box)

        self.videoframe.setFrameShadow(QtWidgets.QFrame.Raised)

        self.vboxlayout = QVBoxLayout()

        self.vboxlayout.addWidget(self.videoframe)




        ######### the vlc

        self.filename='C:/Users/Kikomi/Pictures/Camera Roll/kk.mp4'

        self.media = self.instance.media_new(self.filename)

        self.mediaplayer.set_media(self.media)

        self.mediaplayer.play()




if __name__ == "__main__":

    app = QApplication(sys.argv)

    player = Player()

    player.show()

    player.resize(640, 480)

    if sys.argv[1:]:

        player.OpenFile(sys.argv[1])

    sys.exit(app.exec_())

Solution

  • You have to pass the winId() of the QFrame to the mediaplayer, and the method depends on each OS as I show below:

    import sys
    
    import vlc
    
    from PyQt5 import QtCore, QtGui, QtWidgets
    
    
    class Player(QtWidgets.QMainWindow):
        def __init__(self, parent=None):
            super(Player, self).__init__(parent)
            self.setWindowTitle("Media Player")
            # creating a basic vlc instance
            self.instance = vlc.Instance()
            self.mediaplayer = self.instance.media_player_new()
            ##########video frame
            self.videoframe = QtWidgets.QFrame(
                frameShape=QtWidgets.QFrame.Box, frameShadow=QtWidgets.QFrame.Raised
            )
    
            if sys.platform.startswith("linux"):  # for Linux using the X Server
                self.mediaplayer.set_xwindow(self.videoframe.winId())
            elif sys.platform == "win32":  # for Windows
                self.mediaplayer.set_hwnd(self.videoframe.winId())
            elif sys.platform == "darwin":  # for MacOS
                self.mediaplayer.set_nsobject(self.videoframe.winId())
    
            central_widget = QtWidgets.QWidget()
            self.setCentralWidget(central_widget)
            lay = QtWidgets.QVBoxLayout(central_widget)
            lay.addWidget(self.videoframe)
    
            filename = "/path/of/your/video.mp4"
            media = self.instance.media_new(filename)
            self.mediaplayer.set_media(media)
            self.mediaplayer.play()
    
    
    if __name__ == "__main__":
    
        app = QtWidgets.QApplication(sys.argv)
    
        player = Player()
        player.show()
        player.resize(640, 480)
    
        sys.exit(app.exec_())