5

我正在用 Python 编写一个程序,它从海康威视有限公司生产的 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 年编写的。

我相信由于 pFrameInfo 已经从 dll 中读取,有什么方法可以通过剪切和读取 pFrameInfo 内存空间中的字节来取回存储在 pFrameInfo 结构中的 c_long 数据?由于 pFrameInfo 的所有属性都是 c_long,因此可以逐字节读取结构体可以重构 c_long 变量的值。我只是猜测。请帮忙,这对我来说是一个非常大的问题......

4

1 回答 1

5

I think you need to dereference your pointer to FRAME_INFO:

frameInfo = pFrameInfo.contents
...
print "pFrame Info: %r   " % frameInfo.nWidth
于 2012-09-03T16:16:31.973 回答