2016-12-06 3 views
0

J'ai un flux d'images, au format YUY2. Je voudrais peindre ces images sur QQuickItem - donc je peux l'utiliser avec Qt Quick 2.Comment repeindre QQuickItem rapidement?

J'ai un problème avec la performance alors ma question est quelle est la manière la plus rapide de redessiner l'objet QML écrit en C++? Y at-il un objet gentil dédié au rendu de vidéos?


Ce que j'ai essayé est de créer une classe qui hérite QQuickPaintedItem. J'ai converti des images YUY2 au format RGBA8888, puis l'ai chargé en utilisant QImage, puis l'ai peint en utilisant QPainter. Il s'est avéré inefficace si QQuickPaintedItem était grand - par exemple plus grand que 1000x1000. Une méthode beaucoup plus rapide était de convertir QImage en QPixmap, puis de peindre en utilisant QPainter. Cela fonctionne plutôt bien maintenant mais peut-être y a-t-il un moyen plus rapide? Par exemple, la conversion des images semble trop lente le processus vers le bas.

+3

Vous n'obtiendrez pas de meilleures performances si vous utilisez 'QQuickPaintedItem'. Vous pouvez implémenter un objet avec une géométrie personnalisée et un shader simple pour remplir un quad avec la texture que vous désirez. Ensuite, alimentez les nouvelles textures de l'objet. L'affichage et la mise à l'échelle seront très rapides. Il pourrait déjà y avoir des exemples de cela. Vous pouvez également utiliser 'QQuickFramebufferObject' et mettre à jour la texture du sous-objet render. –

+0

@KubaOber Merci pour l'aide. Si vous le souhaitez, postez votre commentaire en réponse et je l'accepterai. –

Répondre

0

J'ai cela à travailler en utilisant QQuickItem avec la fonction updatePaintNode définie (la première idée de Kuba Ober's commentaire).

This example m'a beaucoup aidé. Dans cela NoisyNode classe rend l'arrière-plan (image statique) et Graph l'utilise. J'ai pris ces deux classes à mon projet et les ai adaptées à mes besoins. Je n'ai eu aucun problème à afficher 1080x1920 pixels, 30fps. Comme je comprends pour afficher une vidéo, vous avez finalement besoin de convertir YUV en RVB alors je l'ai fait tout de suite et a travaillé avec un tableau de pixels RGBA.