python

Qt5 MadiaPlayer

Qt5 MadiaPlayer

環境 ubuntu 22.04 LTS & Qt5

Qt5Player.py

import sys
from PyQt5.QtWidgets import QApplication, QWidget, QHBoxLayout, QVBoxLayout, QPushButton, QSlider, QFileDialog,QLabel, QMessageBox
from PyQt5.QtMultimedia import QMediaPlayer, QMediaContent,QMediaPlaylist
from PyQt5.QtMultimediaWidgets import QVideoWidget
from PyQt5.QtCore import Qt, QUrl,QTime

class MediaPlayer(QWidget):
    def __init__(self, parent=None):
        super(MediaPlayer, self).__init__(parent)
 
        self.setWindowTitle("ssksvr.com MediaPlayer")
        self.resize(960, 240)

        # changing the background color to ghostwhite
        self.setStyleSheet("background-color: ghostwhite;")

        self.myinfo = ""

        # Create the media player object
        self.mediaPlayer = QMediaPlayer(None, QMediaPlayer.VideoSurface)
        self.mediaPlayer.setVolume(70)
        self.playlist = QMediaPlaylist(self.mediaPlayer)

        # Create label
        self.playLabel = QLabel()
        self.playLabel.setStyleSheet("background-color: honeydew; border: 0.5px solid black;")
        self.lbl = QLabel()
        self.elbl = QLabel()

        # Create the prev button
        self.prevButton = QPushButton("Prev")
        self.prevButton.setEnabled(False)
        self.prevButton.clicked.connect(self.prev)
        self.prevButton.setStyleSheet("background-color: peachpuff;")

        # Create the play button
        self.playButton = QPushButton("Play")
        self.playButton.setEnabled(False)
        self.playButton.clicked.connect(self.play)
        self.playButton.setStyleSheet("background-color: peachpuff;")

        # Create the next button
        self.nextButton = QPushButton("Next")
        self.nextButton.setEnabled(False)
        self.nextButton.clicked.connect(self.next)
        self.nextButton.setStyleSheet("background-color: peachpuff;")

        # Create the stop button
        self.stopButton = QPushButton("Stop")
        self.stopButton.setEnabled(False)
        self.stopButton.clicked.connect(self.stop)
        self.stopButton.setStyleSheet("background-color: peachpuff;")

        # Create the slider for seeking
        self.seekSlider = QSlider(Qt.Horizontal)
        self.seekSlider.setRange(0, 0)
        self.seekSlider.sliderMoved.connect(self.setPosition)
        self.seekSlider.setStyleSheet("background-color: aquamarine;")

        # Create the open button
        self.openButton = QPushButton("Open")
        self.openButton.clicked.connect(self.openFile)
        self.openButton.setStyleSheet("background-color: peachpuff;")

        # Create the List button
        self.listButton = QPushButton("PlayList")
        self.listButton.clicked.connect(self.list)
        self.listButton.setStyleSheet("background-color: peachpuff;")

        # Create the End button
        self.endButton = QPushButton("End")
        self.endButton.clicked.connect(self.end)
        self.endButton.setStyleSheet("background-color: plum;")

        # Create the horizontal layout1 for label
        controlLayout1 = QHBoxLayout()
        controlLayout1.addWidget(self.playLabel)

        # Create the horizontal layout2 for the buttons and slider
        controlLayout2 = QHBoxLayout()
        controlLayout2.setContentsMargins(0, 0, 0, 0)
        controlLayout2.addWidget(self.prevButton)
        controlLayout2.addWidget(self.playButton)
        controlLayout2.addWidget(self.nextButton)
        controlLayout2.addWidget(self.stopButton)
        controlLayout2.addWidget(self.lbl)
        controlLayout2.addWidget(self.seekSlider)
        controlLayout2.addWidget(self.elbl)
        controlLayout2.addWidget(self.openButton)
        controlLayout2.addWidget(self.listButton)
        controlLayout2.addWidget(self.endButton)

        # Create the video widget
        self.videoWidget = QVideoWidget()
        self.videoWidget.setStyleSheet("background-color: honeydew; border: 1px solid blue;")

        # Create the vertical layout for the window
        mainLayout = QVBoxLayout()
        #mainLayout.addLayout(controlLayout1)
        mainLayout.addWidget(self.videoWidget)
        mainLayout.addLayout(controlLayout2)

        # Set the main layout of the window
        self.setLayout(mainLayout)
 
        # Connect the media player signals to the appropriate methods
        self.mediaPlayer.stateChanged.connect(self.mediaStateChanged)
        self.mediaPlayer.positionChanged.connect(self.positionChanged)
        self.mediaPlayer.durationChanged.connect(self.durationChanged)
        self.seekSlider.mousePressEvent = self.__direct_slider_click
        self.seekSlider.sliderMoved.connect(self.set_position)
        self.videoWidget.mousePressEvent = self.videowidget_click

    def openFile(self):

        #fileName, _ = QFileDialog.getOpenFileName(self, "Open Media", "", "Video Files (*.mp4 *.avi *.mkv *.ts *.mp3 *.wav *.flac)")
        #if fileName != '':
        #   self.setMedia(fileName)
        fileName, _ = QFileDialog.getOpenFileNames(self, "Open Media", "", "Video Files (*.mp4 *.avi *.mkv *.ts *.mp3 *.wav *.flac)")
        #self.playLabel.setText("")
        self.setWindowTitle("ssksvr.com MediaPlayer")
        item2 = ""
        self.playlist.clear()
        self.mediaPlayer.setPlaylist(self.playlist)

        for item in fileName:
            if item != '':
               # コロンで分割(maxsplit で最大分割数を指定)
               split_item = item.split('/', maxsplit=20)
               # 2番目の要素、というか最後の要素を取得
               print(split_item[-1])

               item2 = item2 + "▶[ " + split_item[-1] + " ]" + "\n"
               self.myinfo=item2

               url = QUrl.fromLocalFile(item)
               self.playlist.addMedia(QMediaContent(url))

        self.mediaPlayer.setPlaylist(self.playlist)
        self.mediaPlayer.playlist().setCurrentIndex(0)
        self.playButton.setEnabled(True)
        self.stopButton.setEnabled(True)
        self.prevButton.setEnabled(True)
        self.nextButton.setEnabled(True)
        self.mediaPlayer.play()
        self.videoWidget.show()
        self.mediaPlayer.setVideoOutput(self.videoWidget)

    def prev(self):
        current = self.mediaPlayer.playlist().currentIndex()
        self.mediaPlayer.playlist().setCurrentIndex(current - 1)
        self.mediaPlayer.play()
        self.videoWidget.show()
        self.mediaPlayer.setVideoOutput(self.videoWidget)

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

    def next(self):
        current = self.mediaPlayer.playlist().currentIndex()
        self.mediaPlayer.playlist().setCurrentIndex(current + 1)
        self.mediaPlayer.play()
        self.videoWidget.show()
        self.mediaPlayer.setVideoOutput(self.videoWidget)

    def stop(self):
        self.mediaPlayer.stop()
 
    def setPosition(self, position):
        self.mediaPlayer.setPosition(position)

    def mediaStateChanged(self, state):
        if self.mediaPlayer.state() == QMediaPlayer.PlayingState:
            self.playButton.setText("Pause")

        else:
            self.playButton.setText("Play")

    def positionChanged(self, position):
        self.seekSlider.setValue(position)
        mtime = QTime(0,0,0,0)
        mtime = mtime.addMSecs(self.mediaPlayer.position())
        self.lbl.setText(mtime.toString())
        if self.mediaPlayer.state() == QMediaPlayer.StoppedState:
            self.setWindowTitle("ssksvr.com MediaPlayer")

    def durationChanged(self, duration):
        self.seekSlider.setRange(0, duration)
        self.seekSlider.setEnabled(duration > 0)
        self.playButton.setEnabled(duration > 0)
        self.stopButton.setEnabled(duration > 0)
        mtime = QTime(0,0,0,0)
        mtime = mtime.addMSecs(self.mediaPlayer.duration())
        self.elbl.setText(mtime.toString())
        #self.playLabel.setText("[ " + self.mediaPlayer.currentMedia().canonicalUrl().toString() + " ]")
        self.setWindowTitle("[ " + self.mediaPlayer.currentMedia().canonicalUrl().toString() + " ]")
        if self.mediaPlayer.state() == QMediaPlayer.StoppedState:
            self.setWindowTitle("ssksvr.com MediaPlayer")

    def __direct_slider_click(self, event):
        if event.button() == Qt.LeftButton:
            calc_value = self.seekSlider.minimum() + (
                (self.seekSlider.maximum() - self.seekSlider.minimum()) *
                event.x()) / self.seekSlider.width()
            self.seekSlider.setValue(int(calc_value))
            self.set_position(calc_value)
            event.accept()
        QSlider.mousePressEvent(self.seekSlider, event)

    def set_position(self, position):
        self.mediaPlayer.setPosition(int(position))
        self.mediaPlayer.play()

    def videowidget_click(self,event):
        if event.button() == Qt.LeftButton:
            if self.mediaPlayer.state() == QMediaPlayer.PlayingState:
                self.mediaPlayer.pause()
            else:
                self.mediaPlayer.play()
        QVideoWidget.mousePressEvent(self.videoWidget, event)

    def setMedia(self, url):
        mediaContent = QMediaContent(QUrl.fromLocalFile(url))
        self.mediaPlayer.setMedia(mediaContent)
        self.playButton.setEnabled(True)
        self.stopButton.setEnabled(True)
        self.mediaPlayer.play()
        self.videoWidget.show()
        self.mediaPlayer.setVideoOutput(self.videoWidget)

    def list(self):
        msg = QMessageBox()
        msg.setWindowFlags(Qt.FramelessWindowHint | Qt.WindowStaysOnTopHint | Qt.SplashScreen)
        msg.setGeometry(self.frameGeometry().left() + 30, self.frameGeometry().top() + 30, 300, 400)
        msg.setIcon(QMessageBox.Information)
        msg.setText("MediaPlayer --- PlayList")
        msg.setInformativeText(self.myinfo)
        msg.setStandardButtons(QMessageBox.Close)
        msg.exec()

    def end(self):
        self.close()
 
if __name__ == '__main__':
    app = QApplication(sys.argv)
    player = MediaPlayer()
    player.show()
    sys.exit(app.exec_())

起動画面

Openボタンでファイル選択(複数可能)

Media再生中

PlayListボタンでプレイリスト表示

Prevボタンで前へ移動し再生

Nextボタンで次へ移動し再生

スライダーのマウス移動でその時点から再生

画面の左クリックで再生、一時停止

-python

PAGE TOP