2016-12-06 1 views
0

Ich habe einen Strom von Bildern im YUY2-Format. Ich möchte diese Bilder auf QQuickItem malen - so kann ich es mit Qt Quick 2 verwenden.Wie schnell QQuickItem neu streichen?

Ich habe ein Problem mit der Leistung, so ist meine Frage, was ist der schnellste Weg, QML-Objekt in C++ geschrieben neu zu zeichnen? Gibt es ein nettes Objekt zum Rendern von Videos?


Was ich versucht habe, ist eine Klasse erstellen, die QQuickPaintedItem erbt. Ich habe YUY2-Bilder in das RGBA8888-Format konvertiert, dann mit QImage geladen und dann mit QPainter bemalt. Es erwies sich als nicht effizient, wenn QQuickPaintedItem groß war - zum Beispiel größer als 1000x1000. Viel schneller war die Methode, QImage in QPixmap umzuwandeln und dann unter Verwendung von QPainter zu streichen. Es funktioniert jetzt etwas gut, aber vielleicht gibt es einen schnelleren Weg? Zum Beispiel scheint die Konvertierung von Bildern zu langsam den Prozess zu verlangsamen.

+3

Sie werden keine bessere Leistung erhalten, wenn Sie 'QQuickPaintedItem' verwenden. Sie können ein Element mit benutzerdefinierter Geometrie und einem einfachen Shader implementieren, um ein Quad mit der gewünschten Textur zu füllen. Füttere dann den Gegenstand mit neuen Texturen. Die Anzeige und Skalierung wird sehr schnell sein. Vielleicht gibt es dafür schon Beispiele. Sie können auch 'QQuickFramebufferObject' verwenden und die Textur aus dem Render-Unterobjekt aktualisieren. –

+0

@KubaOber Danke für die Hilfe. Wenn du möchtest, poste deinen Kommentar als Antwort und ich werde ihn akzeptieren. –

Antwort

0

Ich habe dies zur Arbeit mit QQuickItem mit definierten updatePaintNode Funktion (die erste Idee von Kuba Ober's Kommentar).

This example hat mir sehr geholfen. In ihm NoisyNode Klasse rendert Hintergrund (statisches Bild) und Graph verwendet es. Ich habe diese beiden Klassen zu meinem Projekt genommen und an meine Bedürfnisse angepasst. Ich hatte kein Problem, 1080x1920 Pixel, 30fps anzuzeigen. Wie ich es verstehe, um ein Video anzuzeigen, müssen Sie schließlich YUV in RGB konvertieren, also tat ich das sofort und arbeitete mit einem Array von RGBA-Pixeln.

Verwandte Themen