Estoy escribiendo un programa en Python, que lee los datos del marco YV12 de una cámara IP producida por Hikvision Ltd.Devolución de una estructura utilizando ctypes en Python
En el SDK, que proporcionaron una llamada funcional que me permite configurar una devolución de llamada para recuperar los datos del cuadro.
funciónMi devolución de llamada es la siguiente:
def py_fDecodeCallBack(lPort, pBuffer, lSize, pFrameInfo, lReserved1, lReserved2):
print "lPort: %r" % lPort
print "lSize: %r " % lSize
print pFrameInfo
print pBuffer
print "pFrame Info: %r " % pFrameInfo.nWidth
return 0
$ La estructura de pFramInfo se define así:
class FRAME_INFO(Structure):
_fields_ =[
('nWidth', c_long),
('nHeight', c_long),
('nStamp', c_long),
('nType', c_long),
('nFrameRate', c_long),
('dwFrameNum', wintypes.DWORD)
]
$
utilizo el siguiente código para configurar la devolución de llamada función:
FSETDECCALLBACK = WINFUNCTYPE(c_bool, c_long, POINTER(wintypes.BYTE), c_long, POINTER(FRAME_INFO), c_long, c_long)
fSetDecCallBack = FSETDECCALLBACK(py_fDecodeCallBack)
Entonces la función de devolución de llamada está siendo llamado por el SDK y se imprime el siguiente:
Traceback (most recent call last):
File "_ctypes/callbacks.c", line 313, in 'calling callback function'
lPort: 0
lSize: 1382400
<mytypes.LP_FRAME_INFO object at 0x03109CB0>
<wintypes2.LP_c_byte object at 0x03109D00>
File "C:\Users\Rex\workspace\iSentry\hcnetsdkhelper.py", line 76, in py_fDecodeCallBack
print "pFrame Info: %r " % pFrameInfo.nWidth
AttributeError: 'LP_FRAME_INFO' object has no attribute 'nWidth'
tipos simples como c_long (lport y lSize) están siendo leído correctamente, pero la estructura pFrameInfo no tiene los campos que Lo he definido No puedo leer pFrameInfo.nWidth ya que dice que no hay tal atributo ...
Mi pregunta es: ¿Cómo puedo leer los atributos en la estructura devuelta desde el dll a través de ctypes. No puedo ver ningún ejemplo en Google haciendo esto, y me encontré con un tema en python.org http://bugs.python.org/issue5710 decir esto simplemente no se puede hacer, pero el mensaje está escrito en 2009.
Creo que como pFrameInfo ya está siendo leído desde el dll, ¿hay alguna forma de recuperar los datos c_long almacenados en la estructura pFrameInfo cortando y leyendo los bytes en el espacio de memoria de pFrameInfo? Dado que todos los atributos de pFrameInfo son c_long, puede leer la estructura byte por byte y puede reconstruir el valor de las variables c_long. Solo estoy adivinando. Por favor, ayuda, este es un problema muy grande para mí ...
Wow! ¡¡¡Muchas gracias!!! ¡¡Funcionó!! Ahora puedo acceder a todos los contenidos dentro de la estructura. –