Я использую gstreamer, поскольку у ffmpeg нет бэкенда для поддержки PySide6 QMediaPlayer. Итак, я использую команду «export QT_MEDIA_BACKEND=gstreamer»
И вот мой код:
Код: Выделить всё
import sys
import time
from PySide6.QtCore import QUrl, QTimer
from PySide6.QtMultimedia import QMediaPlayer, QAudioOutput
from PySide6.QtMultimediaWidgets import QVideoWidget
from PySide6.QtWidgets import QApplication, QMainWindow, QPushButton, QVBoxLayout, QWidget, QLabel
class VideoPlayer(QMainWindow):
def __init__(self):
super().__init__()
self.mediaPlayer = QMediaPlayer()
self.audioOutput = QAudioOutput()
self.mediaPlayer.setAudioOutput(self.audioOutput)
videoWidget = QVideoWidget()
playButton = QPushButton("Play/Pause")
playButton.clicked.connect(self.play_video)
self.statusLabel = QLabel()
self.timeLabel = QLabel()
self.frameDropLabel = QLabel()
layout = QVBoxLayout()
layout.addWidget(videoWidget)
layout.addWidget(playButton)
layout.addWidget(self.statusLabel)
layout.addWidget(self.timeLabel)
layout.addWidget(self.frameDropLabel)
container = QWidget()
container.setLayout(layout)
self.setCentralWidget(container)
self.mediaPlayer.setVideoOutput(videoWidget)
self.mediaPlayer.setSource(QUrl.fromLocalFile("/home/gabriel/Desktop/Recicle/recicle/VIdeo/output1.mp4"))
self.mediaPlayer.errorOccurred.connect(self.handle_error)
self.mediaPlayer.playbackStateChanged.connect(self.update_status)
self.mediaPlayer.positionChanged.connect(self.update_position)
self.startTime = 0
self.timer = QTimer()
self.timer.timeout.connect(self.update_time)
def play_video(self):
if self.mediaPlayer.playbackState() == QMediaPlayer.PlayingState:
self.mediaPlayer.pause()
self.pauseTime = time.time()
self.timer.stop()
print("Paused at:", self.mediaPlayer.position() / 1000.0, "seconds")
else:
if self.mediaPlayer.playbackState() == QMediaPlayer.PausedState:
paused_duration = time.time() - self.pauseTime
self.startTime += paused_duration
self.mediaPlayer.play()
if self.startTime == 0:
self.startTime = time.time()
self.timer.start(1000) # Update every second
print("Resumed at:", self.mediaPlayer.position() / 1000.0, "seconds")
def handle_error(self, error):
self.statusLabel.setText(f"Error: {self.mediaPlayer.errorString()}")
print(f"Error: {self.mediaPlayer.errorString()}")
def update_status(self, state):
states = {
QMediaPlayer.StoppedState: "Stopped",
QMediaPlayer.PlayingState: "Playing",
QMediaPlayer.PausedState: "Paused"
}
self.statusLabel.setText(f"State: {states.get(state, 'Unknown')}")
print(f"State: {states.get(state, 'Unknown')}")
if state == QMediaPlayer.StoppedState:
self.timer.stop()
elif state == QMediaPlayer.PausedState:
self.pauseTime = time.time()
def update_position(self, position):
elapsed_time = time.time() - self.startTime
actual_time = position / 1000
self.timeLabel.setText(f"Expected Time: {elapsed_time:.2f} seconds, Actual Time: {actual_time:.2f} seconds")
print(f"Expected Time: {elapsed_time:.2f} seconds, Actual Time: {actual_time:.2f} seconds")
if abs(elapsed_time - actual_time) > 1:
self.frameDropLabel.setText("Warning: Frame drop detected!")
print("Warning: Frame drop detected!")
def update_time(self):
elapsed_time = time.time() - self.startTime
self.timeLabel.setText(f"Elapsed Time: {elapsed_time:.2f} seconds")
if __name__ == '__main__':
app = QApplication(sys.argv)
player = VideoPlayer()
player.resize(640, 480)
player.show()
sys.exit(app.exec())
Подробнее здесь: https://stackoverflow.com/questions/788 ... on-a-raspb