首先要注意的是库必须要更新,在开发的时候,发现5.2的库没有上传人脸库的一个结构体,因此有必要更新库到5.3
其他 我这里是由海康原来的demo,生成一个动态库,然后再由python调用这个动态库实现人脸上传和视频码流返回
,码流返回我采用的是在c++里面传入python的函数,然后将函数全局化,然后在回调函数里面调用python的函数将码流信息通过参数形式返回到python
首先要修改的是makefile,修改之后的makefile如下:
CC = gcc
CXX = g++
CFLAGS = -g
CXXFLAGS = $(CFLAGS)
LIBPATH = ./
LIBS = -Wl,-rpath=./:./HCNetSDKCom -lhcnetsdk
SRC = ./main.cpp
TARGET = ./getpsdata.so
all:
$(CXX) $(OPTI) $(CXXFLAGS) -shared -fPIC $(SRC) -o $(TARGET) -L$(LIBPATH) $(LIBS)
.PHONY: clean
clean:
rm -f $(TARGET)
makefile 主要修改的是生成的目标,以及编译的时候多带了编译共享库的选项
修改后的main文件如下:
/*
* Copyright(C) 2011,Hikvision Digital Technology Co., Ltd
*
* File name��main.cpp
* Discription��demo for muti thread get stream
* Version ��1.0
* Author ��luoyuhua
* Create Date��2011-12-10
* Modification History��
*/
#include <stdio.h>
#include <errno.h>
#include <string.h>
#include <unistd.h>
#include "HCNetSDK.h"
#include "iniFile.h"
// ȡ�������Ϣ�������̴߳���
typedef struct tagREAL_PLAY_INFO
{
char szIP[16];
int iUserID;
int iChannel;
}REAL_PLAY_INFO, *LPREAL_PLAY_INFO;
//导入人脸数据条件
FILE *g_pFile = NULL;
typedef void (*Func)(BYTE*);
Func rePyGetData = NULL;
void g_RealDataCallBack_V30(LONG lRealHandle, DWORD dwDataType, BYTE *pBuffer,DWORD dwBufSize,void* dwUser)
{
//LPREAL_PLAY_INFO pPlayInfo = (LPREAL_PLAY_INFO)dwUser;
//printf("[g_RealDataCallBack_V30]Get data, ip=%s, channel=%d, handle=%d, data size is %d, thread=%d\n",
//pPlayInfo->szIP, pPlayInfo->iChannel, lRealHandle, dwBufSize, pthread_self());
//printf("[g_RealDataCallBack_V30]Get data, handle=%d, data size is %d, thread=%d\n",
//lRealHandle, dwBufSize, pthread_self());
//NET_DVR_SaveRealData(lRealHandle, cFilename);
}
void PsDataCallBack(LONG lRealHandle, DWORD dwDataType,BYTE *pPacketBuffer,DWORD nPacketSize, void* pUser)
{
if (dwDataType == NET_DVR_SYSHEAD)
{
//д��ͷ����
g_pFile = fopen("./record/ps.dat", "wb");
if (g_pFile == NULL)
{
printf("CreateFileHead fail\n");
return;
}
//д��ͷ����
fwrite(pPacketBuffer, sizeof(unsigned char), nPacketSize, g_pFile);
printf("write head len=%d\n", nPacketSize);
}
else
{
if(g_pFile != NULL)
{
fwrite(pPacketBuffer, sizeof(unsigned char), nPacketSize, g_pFile);
printf("write data len=%d\n", nPacketSize);
rePyGetData(pPacketBuffer);
}
}
}
extern "C"{
void GetStream(Func getData)
{
rePyGetData = getData;
printf("GetSteam+++++++++++++++++++++++++++++++++++++++++++\n");
NET_