Frage

Ich versuche, eine Videoanwendung in PyQt4 zu schreiben und ich habe verwendet Python ctypes in einem alten Legacy-Video-Decoder-Bibliothek einzuhaken. Die Bibliothek gibt mir 32-Bit-ARGB-Daten, und ich brauche, dass in ein QImage einzuschalten. Ich habe arbeiten sie wie folgt:


# Copy the rgb image data from the pointer into the buffer
memmove(self.rgb_buffer, self.rgb_buffer_ptr, self.buffer_size)

# Copy the buffer to a python string
imgdata = ""
for a in self.rgb_buffer:
    imgdata = imgdata + a

# Create a QImage from the string data
img = QImage(imgdata, 720, 288, QImage.Format_ARGB32)

Das Problem besteht darin, dass die Daten als ctypes Typ „ctypes.c_char_Array_829440“ ausgibt, und ich brauche es in eine Zeichenfolge Python zu drehen, so dass ich eine QImage konstruieren kann. Mein Kopiermechanismus nimmt derzeit fast 300 ms pro Bild, so dass es sehr langsam ist. Die dekodieren und Anzeigeteil des Prozesses nur nimmt etwa 50 ms.

Kann jemand denken Sie an irgendwelchen schlauen Abkürzungen ich diesen Prozess zu beschleunigen nehmen und vermeiden die Notwendigkeit, den Puffer zweimal zu kopieren, wie ich zur Zeit mache?

War es hilfreich?

Lösung

Die ctypes.c_char_Array_829400 Beispiel hat die Eigenschaft .raw die einen String zurückgibt möglicherweise NUL-Bytes enthalten, und die Eigenschaft .value die die Zeichenfolge zurück bis zum ersten NUL-Byte, wenn es einen oder mehrere enthält.

Sie können jedoch auch ctypes den Zugriff auf den String an self.rgb_buffer_ptr wie folgt verwenden: ctypes.string_at(self.rgb_buffer_ptr, self.buffer_size); Dies würde die Notwendigkeit für den memmove Aufruf vermeiden.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top