Drehen ctypes Daten in Python-String so schnell wie möglich
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?
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.