2012-09-03 11 views
5

Ich schreibe ein Programm in Python, die die YV12 Rahmendaten von einer IP-Kamera von Hikvision Ltd.eine Struktur Rückkehr ctypes in Python

Im SDK erzeugt liest, sofern sie einen funktionellen Anruf, den mir erlaubt, Richten Sie einen Callback ein, um die Frame-Daten abzurufen.

My Callback-Funktion ist wie folgt:

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 

$ Die Struktur pFramInfo ist wie folgt definiert:

class FRAME_INFO(Structure): 
     _fields_ =[ 
        ('nWidth', c_long), 
        ('nHeight', c_long), 
        ('nStamp', c_long), 
        ('nType', c_long), 
        ('nFrameRate', c_long), 
        ('dwFrameNum', wintypes.DWORD) 
        ] 

$

Ich verwende den folgenden Code der Rückruf einrichten Funktion:

FSETDECCALLBACK = WINFUNCTYPE(c_bool, c_long, POINTER(wintypes.BYTE), c_long, POINTER(FRAME_INFO), c_long, c_long) 
fSetDecCallBack = FSETDECCALLBACK(py_fDecodeCallBack)  

Dann wird die Callback-Funktion durch das SDK aufgerufen wird und es druckt die folgenden:

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' 

Einfache Typen wie c_long (LPORT und LSize) korrekt gelesen werden, aber die pFrameInfo Struktur nicht über die Felder, Ich habe es definiert. Ich kann pFrameInfo.nWidth nicht lesen, da es besagt, dass es kein solches Attribut gibt ...

Meine Frage ist: Wie kann ich die Attribute in der Struktur lesen, die von der DLL durch ctypes zurückgegeben werden. Ich kann keine Beispiele auf Google finden dies zu tun, und ich fand ein Thema in python.org http://bugs.python.org/issue5710 sagen, das ist einfach nicht möglich, aber die Nachricht wird im Jahr 2009 geschrieben.

Ich glaube, dass wie pFrameInfo bereits aus dem gelesen wird dll, gibt es eine Möglichkeit, dass ich die in der pFrameInfo-Struktur gespeicherten c_long-Daten zurückerhalten kann, indem ich die Bytes im Speicherbereich von pFrameInfo ausschneide und lese? Da alle Attribute von pFrameInfo c_long sind, kann das Lesen der Struktur byteweise den Wert der Variablen c_long rekonstruieren. Ich rate nur. Bitte helfen Sie, das ist ein wirklich großes Problem für mich ...

Antwort

4

Ich glaube, Sie müssen dereferenzieren Ihre Zeiger auf FRAME_INFO:

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

Wow! Ich danke dir sehr!!! Es funktionierte!! Jetzt kann ich auf alle Inhalte innerhalb der Struktur zugreifen. –