Switch VLC screens using python-vlc

155 views Asked by At

I have multiple live streams running which I'm playing with python-vlc.

So something like this:

stream1 = vlc.MediaPlayer("rtsp://...")
stream2 = vlc.MediaPlayer("rtsp://...")
stream1.play()
stream1.audio_toggle_mute()
stream2.play()
stream2.toggle_fullscreen()

I can use toggle_fullscreen to display one but how can I switch between multiple streams and bring a specific one to the foreground? Would I just have to stop and start it again or is there an easier way?

1

There are 1 answers

0
asm On

I ended up using PyQt5 to create a window and embed the vlc media player in it and then switch using that. The code I used to define the stream is:


class Stream(QtWidgets.QMainWindow):

    def __init__(self, url: str, title: str, parent=None):
        super(Stream, self).__init__(parent)
        self.setWindowTitle(title)

        # creating a basic vlc instance
        self.instance = vlc.Instance()
        self.media_player = self.instance.media_player_new()
        self.video_frame = QtWidgets.QFrame()

        if sys.platform.startswith("linux"):  # for Linux using the X Server
            self.media_player.set_xwindow(self.video_frame.winId())
        elif sys.platform == "win32":  # for Windows
            self.media_player.set_hwnd(self.video_frame.winId())
            print(self.media_player.get_hwnd())
        elif sys.platform == "darwin":  # for MacOS
            self.media_player.set_nsobject(self.video_frame.winId())

        central_widget = QtWidgets.QWidget()
        self.setCentralWidget(central_widget)
        lay = QtWidgets.QVBoxLayout(central_widget)
        lay.addWidget(self.video_frame)
        self.video_frame.setStyleSheet("border: 0px")
        central_widget.setStyleSheet("border: 0px")
        self.setStyleSheet("border: 0px")

        youtube_url = pafy.new(url).getbest()
        media = self.instance.media_new(youtube_url.url)
        self.media_player.set_media(media)
        self.media_player.audio_set_volume(0)
        self.media_player.play()
        self.showFullScreen()

    def bring_to_foreground(self):
        self.window().activateWindow()
        self.media_player.audio_set_volume(100)

    def mute(self):
        self.media_player.audio_set_volume(0)