您好, 欢迎来到 !    登录 | 注册 | | 设为首页 | 收藏本站

在Python中使用ctypes返回结构

5b51 2022/1/14 8:20:56 python 字数 4249 阅读 548 来源 www.jb51.cc/python

我正在编写一个Python程序,它从海康威视有限公司生产的IP摄像机读取YV12帧数据.在SDK中,他们提供了一个函数调用,允许我设置一个Callback来检索Frame Data.我的回调函数是这样的:def py_fDecodeCallBack(lPort, pBuffer, lSize, pFrameInfo, lReserved1, lReserve

概述

我正在编写一个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)    

然后SDK调用回调函数,它打印出以下内容

Traceback (most recent call last):
  File "_ctypes/callbacks.c",line 313,in 'calling callback function'
lPort: 0
lSize: 1382400   

  
   %r   " % pFrameInfo.nWidth
AttributeError: 'LP_FRAME_INFO' object has no attribute 'nWidth'

  

正确读取了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变量的值.我只是在猜测.请帮忙,对我来说这是一个非常大的问题…

frameInfo = pFrameInfo.contents
...
print "pFrame Info: %r   " % frameInfo.nWidth

总结

以上是编程之家为你收集整理的在Python中使用ctypes返回结构全部内容,希望文章能够帮你解决在Python中使用ctypes返回结构所遇到的程序开发问题。


如果您也喜欢它,动动您的小指点个赞吧

除非注明,文章均由 laddyq.com 整理发布,欢迎转载。

转载请注明:
链接:http://laddyq.com
来源:laddyq.com
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。


联系我
置顶