QMediaPlayer负播放率不倒带视频

时间:2018-09-03 20:10:44

标签: python pyqt5 qmediaplayer

我正在尝试使用QMediaPlayer创建一个..媒体播放器。我希望能够通过按一下按钮来倒带视频。

但是通过playbackRate设置否定的QMediaPlayer.setPlaybackRate似乎并不能倒带视频。它一直在前进。

不想更改视频的位置,我希望视频以负速播放。根据我的一些逻辑,将playbackRate设置为负值将使视频反向播放。但这只是没有发生。如果您不清楚我的理解,请看这里video的播放效果。

这里有一些准系统代码可以重现该问题:

import sys

from PyQt5.QtCore import Qt, QUrl, QEvent
from PyQt5.QtMultimedia import QMediaContent, QMediaPlayer
from PyQt5.QtMultimediaWidgets import QVideoWidget
from PyQt5.QtWidgets import QMainWindow, QApplication

class VideoWindow(QMainWindow):
    def __init__(self, parent=None):
        super().__init__(parent)

        videoWidget = QVideoWidget()
        self.setCentralWidget(videoWidget)

        self.mediaPlayer = QMediaPlayer(None, QMediaPlayer.VideoSurface)
        self.mediaPlayer.setVideoOutput(videoWidget)
        self.mediaPlayer.setMedia(
            QMediaContent(QUrl.fromLocalFile(r"<some video file>.mp4"))
        )
        self.mediaPlayer.play()

        app.installEventFilter(self)

    def eventFilter(self, source, event):
        if event.type() == QEvent.KeyPress:
            key = event.key()

            if key == Qt.Key_A:
                self.mediaPlayer.setPlaybackRate(1.0)
            elif key == Qt.Key_Y:
                self.mediaPlayer.setPlaybackRate(-1.0) # This doesn't work! :(

        return super().eventFilter(source, event)

    def closeEvent(self, event):
        self.mediaPlayer.setMedia(QMediaContent())

if __name__ == '__main__':
    app = QApplication(sys.argv)

    player = VideoWindow()
    player.resize(640, 480)
    player.show()

    exitCode = app.exec_()
    sys.exit(exitCode)

我尝试寻找解决方案,但是我得到的只是documentation所说的(强调我的意思):

  可以设置

小于零的值,并指示媒体快退   标准步伐的乘数。

但是,我没有看到这种效果。

我确实注意到了这一点:

  

并非所有播放服务都支持更改播放速率。

是否有可能无法倒带mp4?也许我需要安装/更改某些东西?

1 个答案:

答案 0 :(得分:2)

QMediaPlayer.playbackRate属性保存当前媒体的播放速率。 此值是应用于媒体标准播放速率的乘数。

Key_AKey_ZKey_Y键查看其工作原理。


如果要倒带视频,则应使用QMediaPlayer.position属性,该属性保留当前媒体的播放位置。 该值是当前播放位置,以自媒体开始以来的毫秒数表示。

Key_MKey_P键查看其工作原理。

import sys

from PyQt5.QtCore import Qt, QUrl, QEvent
from PyQt5.QtMultimedia import QMediaContent, QMediaPlayer
from PyQt5.QtMultimediaWidgets import QVideoWidget
from PyQt5.QtWidgets import QMainWindow, QApplication

class VideoWindow(QMainWindow):
    def __init__(self, parent=None):
        super().__init__(parent)

        videoWidget = QVideoWidget()
        self.setCentralWidget(videoWidget)

        self.mediaPlayer = QMediaPlayer(None, QMediaPlayer.VideoSurface)
        self.mediaPlayer.setVideoOutput(videoWidget)
        self.mediaPlayer.setMedia(
            QMediaContent(QUrl.fromLocalFile(r"<some video file>.mp4"))
        )
        self.mediaPlayer.play()

        app.installEventFilter(self)

    def eventFilter(self, source, event):
        if event.type() == QEvent.KeyPress:
            key = event.key()

            # It Playback Rate !
            if key == Qt.Key_A:
                #self.mediaPlayer.setPlaybackRate(1.0)
                self.mediaPlayer.setPlaybackRate(1.5)
            elif key == Qt.Key_Z:
                self.mediaPlayer.setPlaybackRate(0.8)
            elif key == Qt.Key_Y:
                self.mediaPlayer.setPlaybackRate(1.0)                        

            # setPosition(int), argument is in milliseconds.
            elif key == Qt.Key_M:
                self.mediaPlayer.setPosition(self.mediaPlayer.position() - 10000)
            elif key == Qt.Key_P:
                self.mediaPlayer.setPosition(self.mediaPlayer.position() + 10000)                

        return super().eventFilter(source, event)


    def closeEvent(self, event):
        self.mediaPlayer.setMedia(QMediaContent())

if __name__ == '__main__':
    app = QApplication(sys.argv)

    player = VideoWindow()
    player.resize(640, 480)
    player.show()

    exitCode = app.exec_()
    sys.exit(exitCode)