Exemple #1
0
class MainWin(QMainWindow, Ui_MediaPlayer):
    def __init__(self, parent=None):
        super().__init__(parent)
        self.setupUi(self)
        # 设置背景透明
        # self.setAttribute(Qt.WA_TranslucentBackground)
        # 设置无边框样式
        self.setWindowFlags(Qt.FramelessWindowHint)
        # 设置背景颜色
        # self.setStyleSheet('QWidget{background-color:blue}')
        # 信号槽
        self.actionMaximize.triggered.connect(self.showMaximized)
        self.actionMinimize.triggered.connect(self.showMinimized)
        self.actionDefault.triggered.connect(self.showNormal)

        self.playButton.clicked.connect(self.play_pause)
        self.positionslider.sliderMoved.connect(self.set_position)
        self.positionslider.sliderPressed.connect(self.set_position)
        self.volumeslider.valueChanged.connect(self.set_volume)
        self.soundButton.clicked.connect(self.set_mute)
        self.getStatusButton.clicked.connect(self.setStatus)
        # vlc
        self.instance = vlc.Instance()
        self.media = None
        self.mediaplayer = self.instance.media_player_new()
        self.is_paused = False
        self.is_urlplay = False
        self.original_valume = 0
        # self.mediaplayer.set_fullscreen(True)
        # self.fullscreenButton.clicked.connect(self.set_fscreen)
        # timer
        self.timer = QtCore.QTimer(self)
        self.timer.setInterval(100)  # 设置更新时间为100ms
        self.timer.timeout.connect(self.update_ui)
        self.cnt = 0
        # 鼠标
        self.m_flag = False
        # 声音
        self.volumeslider.setValue(self.mediaplayer.audio_get_volume())
        # 监控
        self.monitor = Monitor()
        # 绘图
        # self.widget.toolbar.setVisible(False)
        # self.widget_2.toolbar.setVisible(False)

    def getfps(self):
        return self.mediaplayer.get_fps()

    def set_fscreen(self):
        # self.mediaplayer.set_hwnd(0)
        self.mediaplayer.toggle_fullscreen()
        # print(self.mediaplayer.get_fullscreen())

    def set_mute(self):
        volume = self.mediaplayer.audio_get_volume()
        icon = QtGui.QIcon()
        if volume == 0:  # 如果当前是静音
            self.mediaplayer.audio_set_volume(self.original_valume)
            icon.addPixmap(QtGui.QPixmap("src\sound.svg"), QtGui.QIcon.Normal,
                           QtGui.QIcon.On)
            self.volumeslider.setValue(self.original_valume)
        else:  # 如果当前有声音
            self.original_valume = self.mediaplayer.audio_get_volume()
            self.mediaplayer.audio_set_volume(0)
            self.volumeslider.setValue(0)
            icon.addPixmap(QtGui.QPixmap("src\mute.svg"), QtGui.QIcon.Normal,
                           QtGui.QIcon.On)
        self.soundButton.setIcon(icon)

    def mousePressEvent(self, event):
        if event.button() == Qt.LeftButton:
            self.m_flag = True
            self.m_Position = event.globalPos() - self.pos()  #获取鼠标相对窗口的位置
            event.accept()
            self.setCursor(QCursor(Qt.OpenHandCursor))  #更改鼠标图标

    def mouseMoveEvent(self, QMouseEvent):
        if Qt.LeftButton and self.m_flag:
            self.move(QMouseEvent.globalPos() - self.m_Position)  #更改窗口位置
            QMouseEvent.accept()

    def mouseReleaseEvent(self, QMouseEvent):
        self.m_flag = False
        self.setCursor(QCursor(Qt.ArrowCursor))

    def play_pause(self):
        icon = QtGui.QIcon()
        if self.mediaplayer.is_playing():
            self.mediaplayer.pause()
            icon.addPixmap(QtGui.QPixmap("src\play.svg"), QtGui.QIcon.Normal,
                           QtGui.QIcon.On)
            self.is_paused = True
            self.timer.stop()
        else:
            if self.mediaplayer.play() == -1:
                self.open_file()
                return
            self.mediaplayer.play()
            icon.addPixmap(QtGui.QPixmap("src\pause.svg"), QtGui.QIcon.Normal,
                           QtGui.QIcon.On)
            self.timer.start()
            self.is_paused = False

        self.playButton.setIcon(icon)

    def update_ui(self):
        """Updates the user interface"""

        # Set the slider's position to its corresponding media position
        # Note that the setValue function only takes values of type int,
        # so we must first convert the corresponding media position.

        if self.is_urlplay == False:  # 播放本地视频
            media_pos = int(self.mediaplayer.get_position() * 99)
            self.positionslider.setValue(media_pos)

            # No need to call this function if nothing is played
            if not self.mediaplayer.is_playing():
                self.timer.stop()

                # After the video finished, the play button stills shows "Pause",
                # which is not the desired behavior of a media player.
                # This fixes that "bug".
                if not self.is_paused:
                    self.stop()
        else:
            self.widget.mpl.start_dynamic_plot()
            data = self.monitor.getData()
            if data:
                [time, video, audio, bit, rtmp] = data
                time = time.strftime('%Y-%m-%dT%H:%M:%SZ')
                self.label_time.setText('时间:' + time)
                self.label_rtmp.setText('rtmp域名:' + str(rtmp))
                self.label_audio.setText('视频帧率:' + str(video))
                # self.label_video.setText('音频帧率:' + str(video))
                self.label_bit.setText('比特率:' + str(bit))

        self.timelabel.setText(self.calculate_time())

    def open_file(self):
        """Open a media file in a MediaPlayer
        """

        dialog_txt = "Choose Media File"
        filename = QtWidgets.QFileDialog.getOpenFileName(
            self, dialog_txt, os.path.expanduser('~'))
        if not filename:
            return

        # getOpenFileName returns a tuple, so use only the actual file name
        self.media = self.instance.media_new(filename[0])

        # Put the media in the media player
        self.mediaplayer.set_media(self.media)

        # Parse the metadata of the file
        self.media.parse()

        # Set the title of the track as window title
        self.setWindowTitle(self.media.get_meta(0))

        self.set_platform()

        self.play_pause()

    def set_platform(self):
        if platform.system() == "Linux":  # for Linux using the X Server
            self.mediaplayer.set_xwindow(int(self.videoframe.winId()))
        elif platform.system() == "Windows":  # for Windows
            self.mediaplayer.set_hwnd(int(self.videoframe.winId()))
        elif platform.system() == "Darwin":  # for MacOS
            self.mediaplayer.set_nsobject(int(self.videoframe.winId()))

    def play_url(self, url):
        self.set_platform()

        self.mediaplayer.set_mrl(url)
        self.is_urlplay = True
        self.mediaplayer.play()
        self.timer.start()
        self.is_paused = False

        # print(self.widget.__dict__)
        # self.widget.begin = True

    def set_position(self):
        if self.is_urlplay == False:
            self.timer.stop()
            pos = self.positionslider.value()
            self.mediaplayer.set_position(pos / 99.0)
            self.timer.start()

    def stop(self):
        self.mediaplayer.stop()

    def set_volume(self, volume):
        self.mediaplayer.audio_set_volume(volume)

    def calculate_time(self):
        timestring = '00:00/00:00'
        if self.mediaplayer.get_length() == -1:
            return timestring
        curr_msec = int(self.mediaplayer.get_time())
        curr_minute = 0
        curr_second = 0
        if curr_msec != 0:
            curr_minute = curr_msec // (60 * 1000)
            curr_second = (curr_msec - (curr_minute * 60000)) // 1000
        if self.is_urlplay == False:
            vi_msec = self.mediaplayer.get_length()
            if vi_msec != 0:
                vi_minute = vi_msec // (60 * 1000)
                vi_second = (vi_msec - (vi_minute * 60000)) // 1000
                timestring = str_time(curr_minute) + ':' + str_time(
                    curr_second) + '/' + str_time(vi_minute) + ':' + str_time(
                        vi_second)
        else:
            timestring = str_time(curr_minute) + ':' + str_time(
                curr_second) + '/00:00'
        return timestring

    def setStatus(self):
        time.sleep(3)
        self.label_status.setText('状态: ' + getStatus())
class MyMplCanvas(FigureCanvas):
    """FigureCanvas的最终的父类其实是QWidget。"""

    def __init__(self, parent=None, width=1, height=1, dpi=100):

        # 配置中文显示
        plt.rcParams['font.family'] = ['SimHei']  # 用来正常显示中文标签
        plt.rcParams['axes.unicode_minus'] = False  # 用来正常显示负号
        self.monitor = Monitor()

        self.fig = Figure(figsize=(width,height),dpi=dpi, tight_layout=True, facecolor=(66/255,75/255,83/255))  # 新建一个figure
        # self.fig.canvas.window().statusBar().setVisible(False) # Remove status bar (bottom bar)
        self.axes_fps = self.fig.add_subplot(211)  # 建立一个子图,如果要建立复合图,可以在这里修改
        self.axes_bps = self.fig.add_subplot(212)

        self.data = [[], [], [], []]
        self.xfmt = mdates.DateFormatter('%H:%M:%S')
        self.begin = False

        FigureCanvas.__init__(self, self.fig)
        self.setParent(parent)

        '''定义FigureCanvas的尺寸策略,这部分的意思是设置FigureCanvas,使之尽可能的向外填充空间。'''
        FigureCanvas.setSizePolicy(self,
                                   QSizePolicy.Expanding,
                                   QSizePolicy.Expanding)
        FigureCanvas.updateGeometry(self)

    '''绘制静态图,可以在这里定义自己的绘图逻辑'''

    def start_static_plot(self):
        # self.fig.suptitle('测试图')
        t = arange(0.0, 3.0, 0.01)
        s = [1]*len(t)
        self.axes_fps.plot(t, s)
        self.axes_fps.set_ylabel('帧率/码率')
        self.axes_fps.set_xlabel('时间')
        self.axes_fps.grid(True)

    '''启动绘制动态图'''

    def start_dynamic_plot(self, *args, **kwargs):
        timer = QtCore.QTimer(self)
        timer.timeout.connect(self.update_figure)  # 每隔一段时间就会触发一次update_figure函数。
        timer.start(100)  # 触发的时间间隔为0.1秒。

    '''动态图的绘图逻辑可以在这里修改'''

    def update_figure(self):
        # if self.begin:
        # 更新图像
        tmp = self.monitor.getData()
        for i in range(0,4):
            self.data[i].append(tmp[i])
        if len(self.data[0]) > 20:   # 限制数据在20个以内
            for i in range(0,4):
                del self.data[i][0] # 超出则删除第一个元素
        # print(self.data[1])

        self.axes_fps.clear()
        self.axes_bps.clear()

        # self.axes_fps.xaxis.set_major_formatter(self.xfmt)
        self.axes_fps.plot(self.data[0], self.data[1], 'g')
        # self.axes_fps.plot(self.data[0], self.data[2], 'y')
        self.axes_fps.set_title('帧率变化图')
        self.axes_fps.set_ylabel('帧率(fps)')
        self.axes_fps.patch.set_facecolor((25/255,35/255,45/255)) # 设置 ax1 区域背景颜色
        self.axes_fps.patch.set_alpha(0.8)
        self.axes_fps.grid(True)


        self.axes_bps.plot(self.data[0], self.data[3], 'g')
        self.axes_bps.set_title('码率变化图')
        self.axes_bps.set_ylabel('码率(bps)')
        self.axes_bps.set_xlabel('时间(time)')
        self.axes_bps.patch.set_facecolor((25/255,35/255,45/255)) # 设置 ax1 区域背景颜色
        self.axes_bps.patch.set_alpha(0.8)
        self.axes_bps.grid(True)
        
        self.draw()