Можно ли передать QBuffer из бэкэнда python в QML MediaPlayer?
Я пытаюсь написать программу просмотра движущихся изображений, сделанных моим смартфоном. Камера снимает видео за несколько секунд до того, как будет сделано изображение, а затем сохраняет и видео, и файл в формате JPEG в одном файле в формате JPEG. [двоичные данные jpg, за которыми следуют двоичные данные mp4].jpg
Я использую python, чтобы открыть сохраненный файл jpeg и прочитать данные jpeg и mp4 в отдельные буферы памяти (QBuffers). Используя QWidgets, я могу передать QBuffer в QMediaPlayer и воспроизвести видео с помощью QVideoWidget. Прежде чем видео закончится, я накладываю на него захваченное изображение высокого качества.
Это работает нормально, однако на долю секунды раздражает мигание черного экрана. При использовании QGraphicsScene мерцания нет, но качество видео и изображения хуже.
Я думал, что QML может не страдать от этого черного мерцания. QML позволяет определить MediaPlayer, однако для этого требуется QUrl. Это может быть локальный файл или веб-ресурс, но я не нашел способа передать данные, уже загруженные в память, в MediaPlayer.
Я не могу получить доступ к объекту QML MediaPlayer из PySide6, поэтому я подумал, что попрошу идеи у влиятельного сообщества :)
Я прочитал предложение предоставить собственный QNetworkAccessManager с динамической загрузкой QML из памяти вместо URL-адреса , однако я пытался как-то понять это, я даже пытался понять синтаксис С++, но мне трудно, будет ли это даже полезно.
PS: это мой первый раз, когда я обращаюсь за какой-либо помощью, связанной с кодированием. Я искал возможные решения
Из QWidgets я попробовал QGraphicsSCene, но качество видео и изображения выглядит хуже.
Поэтому я прибегнул к QML, это может быть полезно, но для MediaPlayer требуется строка, указывающая на исходный файл. Я попытался получить доступ к MediaPlayer напрямую, установив имя объекта в QML и напрямую изменив свойство воспроизведении, однако объект MediaPlayer, по-видимому, уничтожается, когда я пытаюсь получить к нему доступ.
MediaPlayer {
id: player
source: "test_video_file.mp4"
audioOutput: AudioOutput {}
videoOutput: videoOutput
objectName: "medplayer"
playbackRate: 1.0
}
VideoOutput {
id: videoOutput
anchors.fill: parent
anchors.margins: 20
}
medplayer = engine.rootObjects()[0].findChild(QObject, "medplayer")
medplayer.setProperty('playbackRate', 1.5)
RuntimeError: внутренний объект C++ (PySide6.QtMultimedia.QMediaPlayer) уже удален.