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?

È stato utile?

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.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top