我正在用Python编写程序,该程序从由Hikvision Ltd生产的IP摄像机读取YV12帧数据。
在SDK中,他们提供了一个功能调用,允许我设置一个回调以检索框架数据。
我的回调函数是这样的:
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
$
pFramInfo的结构定义如下:
class FRAME_INFO(Structure):
_fields_ =[
('nWidth', c_long),
('nHeight', c_long),
('nStamp', c_long),
('nType', c_long),
('nFrameRate', c_long),
('dwFrameNum', wintypes.DWORD)
]
$
我使用以下代码来设置回调函数:
FSETDECCALLBACK = WINFUNCTYPE(c_bool, c_long, POINTER(wintypes.BYTE), c_long, POINTER(FRAME_INFO), c_long, c_long)
fSetDecCallBack = FSETDECCALLBACK(py_fDecodeCallBack)
然后,SDK将调用回调函数,并输出以下内容:
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'
正确读取了诸如c_long(lPort和lSize)之类的简单类型,但是pFrameInfo结构没有我定义的字段。我无法读取pFrameInfo.nWidth,因为它说没有这样的属性...
我的问题是:
如何通过ctypes读取dll返回的结构中的属性。我在Google上看不到任何这样做的例子,但我在python.org http://bugs.python.org/issue5710中找到了一个话题,说这根本无法完成,但消息写于2009年。
我相信,由于已经从dll中读取了pFrameInfo,是否有任何方法可以通过剪切和读取pFrameInfo的存储空间中的字节来取回存储在pFrameInfo结构中的c_long数据?由于pFrameInfo的所有属性均为c_long,因此可以逐字节读取结构,可以重建c_long变量的值。我只是在猜。请帮助,这对我来说是一个很大的问题...
最佳答案
我认为您需要取消对FRAME_INFO的指针的引用:
frameInfo = pFrameInfo.contents
...
print "pFrame Info: %r " % frameInfo.nWidth
关于python - 在Python中使用ctypes返回结构,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/12250504/