Мне нужно воспроизвести видео .mov (ProRes4444) с альфа-каналом в сцене. У сцены есть фоновое изображение, и мне нужно использовать альфа-канал видео, чтобы оно накладывалось на фон.
Если я обычно открываю видео с помощью QMediaPlayer, альфа-канал отображается черным цветом.
экран с фоновым изображением и видео с черной альфой:
Как я могу заставить вывод QMediaPlayer (QGraphicsVideoItem) учитывать альфа-канал и сделать возможным эффект наложения?
Ближе всего к ответу, основанному на онлайн-исследованиях, я нашел код в cpp, который показывает необходимость создания подкласса QAbstractVideoSurface, который получает видеокадры, преобразуемые в ARGB, а затем перенаправляет их в QLabel, который их отображает.
Отображение видео с альфа-каналом с помощью qt
Я тоже безуспешно пробовал. Это правильный курс или мне просто не хватает чего-то простого в моем текущем коде?
РЕДАКТИРОВАТЬ: Ссылка на файлы (фоновое изображение и видео .mov) https://drive.google.com/drive/folders/1LIZzTg1E8wkaD0YSvkkcfSATdlDTggyh?usp=sharing
import sys
from PyQt5.QtMultimedia import *
from PyQt5.QtMultimediaWidgets import *
from PyQt5.QtWidgets import *
from PyQt5.QtCore import *
from PyQt5.QtGui import *
class VideoWindow(QMainWindow):
def __init__(self):
super(VideoWindow, self).__init__()
self.setWindowTitle('QMediaPlayer TEST')
self.resize(1920, 1080)
self.vista = QGraphicsView(self)
self.vista.setGeometry(QRect(0, 0, 1920, 1080))
self.scene = QGraphicsScene(self.vista)
self.scene.setSceneRect(0, 0, 1920, 1080)
self.vista.setScene(self.scene)
self.graphvitem1 = QGraphicsVideoItem()
#SET BACKGROUND IMAGE ON SCENE
self.tempImg = QPixmap("/Users/elemental/Desktop/pyvids/fons.jpeg")
self.tempImg = self.tempImg.scaled(self.scene.width(), self.scene.height())
self.graphicsPixmapItem = QGraphicsPixmapItem(self.tempImg)
self.scene.addItem(self.graphicsPixmapItem)
#SET VIDEO 1 WITH LOOP
self.mediaPlayer1 = QMediaPlayer(None, QMediaPlayer.VideoSurface)
self.mediaPlayer1.setVideoOutput(self.graphvitem1)
self.playlist1 = QMediaPlaylist(self)
self.playlist1.addMedia(QMediaContent(QUrl.fromLocalFile("/Users/elemental/Desktop/pyvids/vida1.mov")))
self.playlist1.setCurrentIndex(1)
self.playlist1.setPlaybackMode(QMediaPlaylist.CurrentItemInLoop)
self.mediaPlayer1.setPlaylist(self.playlist1)
self.graphvitem1.setPos(500, 100)
self.graphvitem1.setSize(QSizeF(1000, 500))
self.scene.addItem(self.graphvitem1)
self.mediaPlayer1.play()
self.vista.show()
if __name__ == '__main__':
app = QApplication([])
window = VideoWindow()
window.show()
sys.exit(app.exec_())