【问题标题】:QMediaPlayer negative playbackRate doesn't rewind videoQMediaPlayer 负播放率不倒带视频
【发布时间】:2019-02-08 20:43:10
【问题描述】:

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

但通过QMediaPlayer.setPlaybackRate 设置负值playbackRate 似乎并没有让视频倒带。它只是继续向前播放。

不想改变视频的位置,我希望视频以负速播放。通过我的一些逻辑,将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?也许我需要安装/更改一些东西?

【问题讨论】:

  • 对我来说,它在带有 PyQt5 5.11.2 的 Linux 中可以正常工作,你的操作系统和 PyQt5 的版本是什么?
  • @eyllanesc 我有 Windows 10(我相信是 1803,如果相关的话)和相同版本的 PyQt。
  • @S.Nick 我尝试了这个例子,并添加了self.rateBox.addItem("-2.0x", -2.0),但选择它不会倒带视频。就像我的代码一样,它只是继续以上次设置的正速度播放。
  • @eyllanesc 你知道为什么它可以在 Linux 上运行,但在 Windows 上不行吗?我会错过程序/包/设置/任何东西吗?

标签: python pyqt5 qmediaplayer


【解决方案1】:

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)

【讨论】:

  • 不幸的是,这不是我想要的。我不想改变视频的位置,我希望视频以负速度播放。通过我的一些逻辑,将playbackRate 设置为负数将使视频反向播放。但这不会发生。如果你不能清楚地理解我,这里是 video 我的视频会发生什么。
猜你喜欢
  • 2013-02-27
  • 1970-01-01
  • 1970-01-01
  • 2020-08-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多