私はPythonでプログラムを書いています。このプログラムは、HikvisionLtdが製造した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を読み取ることができません...
私の質問は次のとおりです。dllからctypesを介して返された構造体の属性を読み取るにはどうすればよいですか。これを行っているグーグルの例を見ることができず、python.org http://bugs.python.org/issue5710で、これはできないというトピックを見つけましたが、メッセージは2009年に書かれています。
pFrameInfoはすでにdllから読み取られているので、pFrameInfoのメモリ空間のバイトを切り取って読み取ることにより、pFrameInfo構造に格納されているc_longデータを取り戻す方法はありますか?pFrameInfoのすべての属性はc_longであるため、バイトごとに構造を読み取っていると、c_long変数の値を再構築できます。推測しているだけです。助けてください、これは私にとって本当に大きな問題です...