Trasformare i dati ctypes nella stringa di pitone nel minor tempo possibile
Domanda
Sto cercando di scrivere un applicazione video in PyQt4 e ho usato Python ctypes per collegare in una vecchia libreria decoder video legacy. La biblioteca mi dà dati ARGB a 32 bit e ho bisogno di trasformarla in un QImage. Ho ottenuto che funziona nel seguente modo:
# 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)
Il problema è che ctypes uscite i dati come tipo "ctypes.c_char_Array_829440
" e devo trasformarlo in una stringa pitone modo che possa costruire un QImage. Il mio meccanismo di copia è attualmente in corso un'immagine quasi 300ms per quindi è dolorosamente lento. La parte decodifica e la visualizzazione del processo sta prendendo solo circa 50ms.
Qualcuno può pensare a eventuali collegamenti astuzia posso prendere per accelerare questo processo ed evitare la necessità di copiare il buffer due volte come sto facendo attualmente?
Soluzione
L'istanza ctypes.c_char_Array_829400
ha la .raw
proprietà che restituisce una stringa contenente eventualmente byte NUL, e la .value
proprietà che restituisce la stringa fino al primo byte NUL se contiene uno o più.
Tuttavia, è anche possibile utilizzare l'accesso ctypes stringa in self.rgb_buffer_ptr
, in questo modo:
ctypes.string_at(self.rgb_buffer_ptr, self.buffer_size)
; ciò eviterebbe la necessità per la chiamata memmove.