Pergunta

Eu estou tentando escrever um aplicativo de vídeo em PyQt4 e eu usei ctypes Python para ligar para uma biblioteca de decodificador de vídeo legado de idade. A biblioteca me dá dados ARGB de 32 bits e eu preciso transformar isso em um QImage. Eu tenho que trabalhar o seguinte:


# 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)

O problema é que ctypes saídas os dados como tipo "ctypes.c_char_Array_829440" e eu preciso transformá-lo em uma corda python para que eu possa construir um QImage. Meu mecanismo de cópia está actualmente a quase 300ms por imagem, por isso é dolorosamente lento. O decodificar e exibir parte do processo só está levando cerca de 50ms.

Alguém pode pensar em quaisquer atalhos astutos I pode tomar para acelerar este processo e evitar a necessidade de copiar o buffer duas vezes como eu estou fazendo atualmente?

Foi útil?

Solução

O exemplo ctypes.c_char_Array_829400 tem a propriedade .raw que retorna uma cadeia de caracteres contendo possivelmente NUL bytes, e o .value propriedade que devolve a cadeia de cima para o primeiro byte NUL se contiver uma ou mais.

No entanto, você também pode usar ctypes o acesso a corda em self.rgb_buffer_ptr, como este: ctypes.string_at(self.rgb_buffer_ptr, self.buffer_size); isso evitaria a necessidade da chamada memmove.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top