2009-04-03 13 views
3

Ich versuche eine Videoanwendung in PyQt4 zu schreiben und ich habe Python Ctypes verwendet, um in eine alte Legacy Video Decoder Bibliothek einzubinden. Die Bibliothek gibt mir 32-Bit-ARGB-Daten und ich muss daraus ein QImage machen. Ich habe es funktioniert wie folgt:Ctypes Daten so schnell wie möglich in Python String konvertieren


# 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 ist, dass ctypes die Daten als Typ gibt „ctypes.c_char_Array_829440“ und ich brauche es in einen Python-String zu drehen, so dass ich ein QImage konstruieren kann. Mein Kopiermechanismus benötigt derzeit fast 300 ms pro Bild, also ist es schmerzhaft langsam. Der Decodier- und Anzeigeteil des Prozesses dauert nur ungefähr 50 ms.

Kann mir jemand irgendwelche schlauen Abkürzungen vorstellen, die ich machen kann, um diesen Prozess zu beschleunigen und die Notwendigkeit zu vermeiden, den Puffer zweimal zu kopieren, wie ich gerade mache?

Antwort

6

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

Sie können jedoch auch ctypes den Zugriff auf die Zeichenfolge bei self.rgb_buffer_ptr, wie folgt verwenden: ctypes.string_at(self.rgb_buffer_ptr, self.buffer_size); Dies würde den Bedarf für den Memmove-Aufruf vermeiden.

+0

Vielen Dank, die String_at-Funktion hat den Trick gemacht. Ich muss wirklich besser darin werden, Dokumente zu lesen. Ich habe sie ein paar Mal überprüft und immer noch vermisst! – chrism1

Verwandte Themen