QMediaPlayer негативное воспроизведениеRate не перематывает видео - PullRequest
0 голосов
/ 03 сентября 2018

Я пытаюсь использовать QMediaPlayer для создания .. медиаплеера. Я хочу иметь возможность перематывать видео при нажатии кнопки.

Но установка отрицательного значения playbackRate с помощью QMediaPlayer.setPlaybackRate не приводит к перемотке видео. Он просто продолжает играть вперед.

Я не хочу изменить позицию видео, я хочу, чтобы видео воспроизводилось с отрицательной скоростью . Согласно моей логике, установка playbackRate в отрицательное значение заставит видео воспроизводиться в обратном направлении . Но этого просто не происходит. Если вы не можете понять меня ясно, вот видео о том, как должно выглядеть воспроизведение.

Вот некоторый код для воспроизведения проблемы:

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)

Я пытался найти решение, но не получил ничего, кроме того, что документация говорит (выделено мое):

Значения меньше нуля могут быть установлены и указывают, что носитель будет перематывать при множитель стандартного темпа.

Однако я не вижу этого эффекта.

Я заметил это:

Не все службы воспроизведения поддерживают изменение скорости воспроизведения.

Возможно ли, что я не могу перемотать mp4? Возможно, мне нужно что-то установить / изменить?

1 Ответ

0 голосов
/ 10 сентября 2018
Свойство

QMediaPlayer.playbackRate содержит скорость воспроизведения текущего носителя. Это значение является множителем, применяемым к стандартной скорости воспроизведения мультимедиа.

Нажмите клавиши Key_A, Key_Z, Key_Y, чтобы увидеть, как это работает.


Если вы хотите перемотать видео, вы должны использовать свойство QMediaPlayer.position, которое содержит позицию воспроизведения текущего носителя. Значение - это текущая позиция воспроизведения, выраженная в миллисекундах с начала мультимедиа.

Нажмите клавиши Key_M, Key_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)
...