我正在编写一个Python程序,它从海康威视有限公司生产的IP摄像机读取YV12帧数据.
在SDK中,他们提供了一个函数调用,允许我设置一个Callback来检索Frame Data.
我的回调函数是这样的:
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',('nStamp',('nType',('nFrameRate',('dwFrameNum',wintypes.DWORD)
]
$
FSETDECCALLBACK = WINFUNCTYPE(c_bool,c_long,POINTER(wintypes.BYTE),POINTER(FRAME_INFO),c_long)
fSetDecCallBack = FSETDECCALLBACK(py_fDecodeCallBack)
Traceback (most recent call last):
File "_ctypes/callbacks.c",line 313,in 'calling callback function'
lPort: 0
lSize: 1382400
正确读取了c_long(lPort和lSize)这样的简单类型,但pFrameInfo结构没有我定义的字段.我无法读取pFrameInfo.nWidth,因为它说没有这样的属性……
我的问题是:
如何通过ctypes读取从dll返回的结构中的属性.我在谷歌上看不到任何关于这方面的例子,我在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