QMediaPlayer ускоряет видео после приостановки и возобновления видео на Raspberry Pi 5Linux

Ответить Пред. темаСлед. тема
Anonymous
 QMediaPlayer ускоряет видео после приостановки и возобновления видео на Raspberry Pi 5

Сообщение Anonymous »

Итак, я начал тестировать Raspberry Pi 5 с тем же кодом, который ранее использовал на Raspberry Pi 4. В моем коде есть видеоплеер, с помощью которого вы можете воспроизводить видео и приостанавливать его, когда захотите, но когда я приостанавливаю видео, оно просто ускоряет видео, а этого не происходило, когда я использовал 4-ю версию
Я использую 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())
Я пытался обновить библиотеки gstreamer, но это уже самая новая версия, я пытался отформатировать SD-карту, но проблема повторяется. И я пытался поискать все на форумах, но раньше ни у кого не было такой проблемы, если кто-нибудь что-то узнает, буду глубоко благодарен.

Подробнее здесь: https://stackoverflow.com/questions/788 ... on-a-raspb
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение
  • Почему моя хост -машина не может получить доступ после приостановки и возобновления виртуальной машины Linux в VMware? [
    Anonymous » » в форуме Linux
    0 Ответы
    17 Просмотры
    Последнее сообщение Anonymous
  • Техника приостановки потока без использования API приостановки в Java
    Anonymous » » в форуме JAVA
    0 Ответы
    22 Просмотры
    Последнее сообщение Anonymous
  • Техника приостановки потока без использования API приостановки в Java
    Anonymous » » в форуме JAVA
    0 Ответы
    28 Просмотры
    Последнее сообщение Anonymous
  • Воспроизведение музыки с помощью QT6 и QMediaPlayer
    Anonymous » » в форуме C++
    0 Ответы
    59 Просмотры
    Последнее сообщение Anonymous
  • Почему мой QMediaPlayer перестает работать после нескольких итераций цикла?
    Anonymous » » в форуме C++
    0 Ответы
    20 Просмотры
    Последнее сообщение Anonymous

Вернуться в «Linux»