Pregunta

Estoy tratando de escribir una aplicación de vídeo en PyQt4 y he utilizado Python ctypes para enganchar en una biblioteca decodificador de vídeo legado de edad. La biblioteca me da los datos ARGB de 32 bits y necesito convertir eso en un QImage. Tengo que trabajar de la siguiente manera:


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

El problema es que ctypes salida a los datos como tipo "ctypes.c_char_Array_829440" y tengo que convertirlo en una cadena de Python para que pueda construir un QImage. Mi mecanismo de copia se está llevando a imagen casi 300ms por lo que es muy lento. La parte de decodificación y visualización del proceso sólo está tomando aproximadamente 50 ms.

Puede alguien pensar en todos los accesos directos astucia que pueda tomar para acelerar este proceso y evitar la necesidad de copiar el búfer doble que estoy haciendo actualmente?

¿Fue útil?

Solución

La instancia ctypes.c_char_Array_829400 tiene la .raw propiedad que devuelve una cadena que contiene posiblemente bytes NUL, y el .value propiedad que devuelve la cadena hasta el primer byte NUL si contiene uno o más.

Sin embargo, también se puede utilizar ctypes el acceso a la cuerda en self.rgb_buffer_ptr, así: ctypes.string_at(self.rgb_buffer_ptr, self.buffer_size); esto evitaría la necesidad de que la llamada memmove.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top