视频监控安防平台-GB28181SDK(2016版) 和windows demo-提供c++库和windows测试demo
之前上传了linux版本的28181SDK demo,很多人在问我什么时候更新windows的28181SDK Demo,其实windows的sdk很早就开发完了, 一直没时间整理同步上去,windows的sdk也是采用exosip协议栈来开发的支持GB28181-2016的最新协议,支持GB28181 IPC接入、DVR接入、NVR接入和GB28181下级平台设备同时接入功能,后面会提供28181SDK和demo的下载路径,运行环境是在win7 x64位上面编译的C++(videosdkjni.dll),(由于上传资源无法选择0积分下载,没用积分的朋友可以直接加我QQ:123011785,给您发一份)。
支持的功能:
1、接收GB28181设备或者平台注册、注销功能,管理所有注册的28181设备或者平台。
2、接收GB28181设备或者平台心跳功能,心跳超时能将内存里面的管理设备或者平台下线回调事件功能。
3、对GB28181设备或者平台主动布防撤防功能。
4、获取GB28181设备或者平台的资源列表功能,并对获取的到设备列表进行管理,设备管理可以达到1000路以上。
5、对GB28181设备或者平台进行系统目录订阅,接收到消息根据事件回调出接口。
6、对GB28181设备或者平台进行实时视频点播开始和结束功能,并对每路设备实时视频码流状态进行管理,将码流回调出来,支持不少于100的多路并发功能。
7、对GB28181设备或者平台进行PTZ控制功能,支持向上、向下、向左、向右、放大、缩小、聚焦、预置位设置、预置位调用、预置位删除等功能。
8、对GB28181设备或者平台进行录像查询功能。
9、对GB28181设备或者平台进行历史视频点播开始和结束功能,并对每路设备实时视频码流状态进行管理,将码流回调到上层接口。
10、对GB28181设备或者平台进行历史视频进行下载功能,并对每路设备实时视频码流状态进行管理,将码流回调到上层接口。
11、对GB28181设备或者平台进行历史视频点播控制功能,支持播放、暂停、快放、慢放和随机拖放等功能,如果平台支持倒放功能可以协商协议进行倒放功能。
12、对GB28181设备或者平台上线、下线进行事件回调功能。
13、对GB28181设备进行状态或则设备信息查询
以上功能是最基础的GB28181功能点也是最常用的功能,也可以根据需求定制化开发GB28181其他功能
(解码器上墙、语音广播对讲、设备移动位置订阅、主码流和子码流协议、锁和解锁协议规范、
点播控制协议(单帧向前后向前向后播放)、画面分割器协议、键盘切换轮训计划协议、解码器控制通知协议、
字符叠加协议等各种功能),支持非标准GB28181设备的接入,后面可以根据不同码流格式进行转码,
支持H265、H264、MPEG4、MPEG2等格式转码,支持各种分辨率的转码功能,支持码流压缩倍率在10:1比例,
支持码流PS流、ES流、TS流等码流的各种转换。
下面提供windos版本的GB28181SDK和demo。下载地址:http://download.csdn.net/download/songxiao1988918/10221258
欢迎大家试用:
提供接口以代码形式呈现:
头文件GB28181SDK.h:
// 下列 ifdef 块是创建使从 DLL 导出更简单的
// 宏的标准方法。此 DLL 中的所有文件都是用命令行上定义的 GB28181SDK_EXPORTS
// 符号编译的。在使用此 DLL 的
// 任何其他项目上不应定义此符号。这样,源文件中包含此文件的任何其他项目都会将
// GB28181SDK_API 函数视为是从 DLL 导入的,而此 DLL 则将用此宏定义的
// 符号视为是被导出的。
//#define GB28181SDK_API
#define GB28181SDK_EXPORTS
#ifdef GB28181SDK_EXPORTS
#define GB28181SDK_API __declspec(dllexport)
#else
#define GB28181SDK_API __declspec(dllimport)
#endif
//using namespace std;
//typedef void (*AlarmCallBack)(int type, char *content);
//typedef void (*RealDataCallBack)(long PlayHdl, unsigned int DataType,unsigned char* pBuffer, unsigned int BufSize, void *pUser);
typedef void (*EventCallbackDefine)(int eventtype, int eventparam, int datalen, char *data);
typedef void (*StreamCallbackDefine)(long handle, int datatype, int datalen, unsigned char *data, long userdata);
#ifdef __cplusplus
extern "C"{
#endif
//初始化
GB28181SDK_API int C_InitSDK(char *svrip, int listenport, char *svrpubid, char *username, char *password, EventCallbackDefine eventcallback);
//反初始化
GB28181SDK_API int C_UnInitSDK(void);
//向设备获取资源列表;异步返回
//pubid为空,获取所有;或者为某个下级pubid,只获取该下级id的资源
GB28181SDK_API int C_GetResource(char *pubid);
//获取本地已存在的资源列表;主动返回
//pubid为空,获取所有;为某个下级获取该下级所有资源;为某个通道获取该通道信息
GB28181SDK_API const char *C_GetLocalResource(char *pubid);
//实时视频开始
GB28181SDK_API long C_RealVideoStart(char *chanpubid, StreamCallbackDefine realcallback, long userdata);
//实时视频结束
GB28181SDK_API int C_RealVideoStop(long realhandle);
//设备控制
GB28181SDK_API int C_Ptz(char *chanpubid, int ptztype, int ptzparam);
//历史视频查询,异步返回
GB28181SDK_API int C_HisVideoQuery(char *chanpubid, char *begintime, char *endtime);
//历史视频开始
GB28181SDK_API long C_HisVideoStart(char *chanpubid, char *begintime, char *endtime, StreamCallbackDefine hiscallback, long userdata, int download);
//历史视频结束
GB28181SDK_API int C_HisVideoStop(long hishandle);
//历史视频控制
GB28181SDK_API int C_HisVideoCtrl(long hishandle, int ctrltype, long ctrlparam);
//查询设备信息
GB28181SDK_API const char *C_QueryDevInfo(char *pubid, int type);
#ifdef __cplusplus
}
#endif
测试GB28181Test.cpp:
// GB28181Test.cpp : 定义控制台应用程序的入口点。
//
#include "stdafx.h"
#include "GB28181SDK.h"
#pragma comment(lib, "videosdkjni.lib")
//-----------------------------------------------------------
//ptz
#define PTZ_OPT_UP 1 // 方向
#define PTZ_OPT_UP_STOP 2 //
#define PTZ_OPT_DOWN 3 //
#define PTZ_OPT_DOWN_STOP 4 //
#define PTZ_OPT_LEFT 5 //
#define PTZ_OPT_LEFT_STOP 6 //
#define PTZ_OPT_RIGHT 7 //
#define PTZ_OPT_RIGHT_STOP 8 //
#define PTZ_OPT_UR 9 //
#define PTZ_OPT_UR_STOP 10 //
#define PTZ_OPT_UL 11 //
#define PTZ_OPT_UL_STOP 12 //
#define PTZ_OPT_DR 13 //
#define PTZ_OPT_DR_STOP 14 //
#define PTZ_OPT_DL 15 //
#define PTZ_OPT_DL_STOP 16 //
#define PTZ_OPT_ZOOMIN 17 // 缩放
#define PTZ_OPT_ZOOMIN_STOP 18 //
#define PTZ_OPT_ZOOMOUT 19 //
#define PTZ_OPT_ZOOMOUT_STOP 20 //
#define PTZ_OPT_FOCUSNEAR 21 // 焦距
#define PTZ_OPT_FOCUSNEAR_STOP 22 //
#define PTZ_OPT_FOCUSFAR 23 //
#define PTZ_OPT_FOCUSFAR_STOP 24 //
#define PTZ_OPT_POS_SET 25 // 预置位
#define PTZ_OPT_POS_CLEAR 26 //
#define PTZ_OPT_POS_CALL 27 // 调用预置位
#define HIS_VIDEO_CTRL_PLAY 1 //点播播放控制
#define HIS_VIDEO_CTRL_FAST 2 //点播快放控制
#define HIS_VIDEO_CTRL_SLOW 3 //点播慢放控制
#define HIS_VIDEO_CTRL_PAUSE 4 //点播暂停控制
#define HIS_VIDEO_CTRL_JUMP 5 //点播跳转控制
#define QUERY_DEVICE_STATUS 0 //设备状态查询
#define QUERY_DEVICE_INFO 1 //设备信息查询
typedef enum
{
EVENT_REGISTER_STATUS = 1, //注册回调
EVENT_DEVICE_CATALOG = 2, //设备目录
EVENT_DEVICE_ALARM = 3, //设备报警
EVENT_HISVIDEO_STOP_NOTIFY = 4, //历史视频结束通知
EVENT_RECORD_QUERY_NOTIFY = 5, //录像查询回调
}EventCallBackType_E;
//-------------------------------------------------------------
static bool bGetLoaclRes = false;
//打印事件回调信息
void enventcallback(int eventtype, int eventparam, int datalen, char *data)
{
printf("eventtype:%d, eventparam:%d, datalen:%d, data:%s\n", eventtype, eventparam, datalen, data);
if (eventtype == EVENT_DEVICE_CATALOG)
{
bGetLoaclRes = true;
}
else if (eventtype == EVENT_REGISTER_STATUS && eventparam == 1)
{
C_GetResource(NULL);
}
else if (eventtype == EVENT_RECORD_QUERY_NOTIFY)
{
printf("query record info:%s\n", data);
}
}
long userdata1 = 1234;
long userdata2 = 10002;
long userdata3 = 10003;
long userdata10 = 10010;
//打印码流回调信息
void streamcallback(long handle, int datatype, int datalen, unsigned char *data, long userdata)
{
printf("handle:%ld, datatype:%d, datalen:%d, userdata:%ld\n", handle, datatype, datalen, userdata);
if (userdata == userdata1)
{
static FILE* fp11 = NULL;
if (!fp11)
{
printf("fp11 handle:%ld, datatype:%d, datalen:%d, userdata:%ld\n", handle, datatype, datalen, userdata);
fp11= fopen("userdata1.mpg", "wb+");
}
fwrite(data, sizeof(char), datalen, fp11);
}
else if (userdata == userdata2)
{
static FILE* fp22 = NULL;
if (!fp22)
{
printf("fp22 handle:%ld, datatype:%d, datalen:%d, userdata:%ld\n", handle, datatype, datalen, userdata);
fp22 = fopen("userdata2.mpg", "wb+");
}
fwrite(data, sizeof(char), datalen, fp22);
}
else if (userdata == userdata3)
{
static FILE* fp33 = NULL;
if (!fp33)
{
printf("fp33 handle:%ld, datatype:%d, datalen:%d, userdata:%ld\n", handle, datatype, datalen, userdata);
fp33 = fopen("userdata3.mpg", "wb+");
}
fwrite(data, sizeof(char), datalen, fp33);
}
else if (userdata == userdata10)
{
static FILE* fp110 = NULL;
if (!fp110)
{
printf("fp110 handle:%ld, datatype:%d, datalen:%d, userdata:%ld\n", handle, datatype, datalen, userdata);
fp110 = fopen("userdata10.mpg", "wb+");
}
fwrite(data, sizeof(char), datalen, fp110);
}
}
void Test_PTZ(char *chanpubid, int sleeptime)
{
//PTZ控制 PTZ_OPT_UP
C_Ptz(chanpubid, 1, 100);
Sleep(1);
//PTZ控制结束PTZ_OPT_UP_STOP
C_Ptz(chanpubid, 2, 0);
Sleep(sleeptime);
//PTZ控制 PTZ_OPT_DOWN
C_Ptz(chanpubid, 3, 100);
Sleep(1);
//PTZ控制结束PTZ_OPT_UP_STOP
C_Ptz(chanpubid, 4, 0);
Sleep(sleeptime);
//PTZ控制 PTZ_OPT_UP
C_Ptz(chanpubid, 5, 100);
Sleep(1);
//PTZ控制结束PTZ_OPT_UP_STOP
C_Ptz(chanpubid, 6, 0);
Sleep(sleeptime);
//PTZ控制 PTZ_OPT_UP
C_Ptz(chanpubid, 7, 100);
Sleep(1);
//PTZ控制结束PTZ_OPT_UP_STOP
C_Ptz(chanpubid, 8, 0);
Sleep(sleeptime);
//PTZ控制 PTZ_OPT_UP
C_Ptz(chanpubid, 9, 100);
Sleep(1);
//PTZ控制结束PTZ_OPT_UP_STOP
C_Ptz(chanpubid, 10, 0);
Sleep(sleeptime);
//PTZ控制 PTZ_OPT_UP
C_Ptz(chanpubid, 11, 100);
Sleep(1);
//PTZ控制结束PTZ_OPT_UP_STOP
C_Ptz(chanpubid, 12, 0);
Sleep(sleeptime);
//PTZ控制 PTZ_OPT_UP
C_Ptz(chanpubid, 13, 100);
Sleep(1);
//PTZ控制结束PTZ_OPT_UP_STOP
C_Ptz(chanpubid, 14, 0);
Sleep(sleeptime);
//PTZ控制 PTZ_OPT_UP
C_Ptz(chanpubid, 15, 100);
Sleep(1);
//PTZ控制结束PTZ_OPT_UP_STOP
C_Ptz(chanpubid, 16, 0);
Sleep(sleeptime);
//PTZ控制 PTZ_OPT_UP
C_Ptz(chanpubid, 17, 100);
Sleep(1);
//PTZ控制结束PTZ_OPT_UP_STOP
C_Ptz(chanpubid, 18, 0);
Sleep(sleeptime);
//PTZ控制 PTZ_OPT_UP
C_Ptz(chanpubid, 19, 100);
Sleep(1);
//PTZ控制结束PTZ_OPT_UP_STOP
C_Ptz(chanpubid, 20, 0);
Sleep(sleeptime);
//PTZ控制 PTZ_OPT_UP
C_Ptz(chanpubid, 21, 100);
Sleep(1);
//PTZ控制结束PTZ_OPT_UP_STOP
C_Ptz(chanpubid, 22, 0);
Sleep(sleeptime);
//PTZ控制 PTZ_OPT_UP
C_Ptz(chanpubid, 23, 100);
Sleep(1);
//PTZ控制结束PTZ_OPT_UP_STOP
C_Ptz(chanpubid, 24, 0);
Sleep(sleeptime);
//PTZ控制 PTZ_OPT_UP
C_Ptz(chanpubid, 25, 100);
Sleep(sleeptime);
//PTZ控制结束PTZ_OPT_UP_STOP
C_Ptz(chanpubid, 27, 100);
Sleep(sleeptime);
//PTZ控制结束PTZ_OPT_UP_STOP
C_Ptz(chanpubid, 26, 100);
Sleep(sleeptime);
}
int _tmain(int argc, _TCHAR* argv[])
{
int iRet = -1;
//初始化设置 SIP服务器的IP(本机ip,必须填写正确)、端口、地址编码(必须为200平台类型)、用户名、密码、事件回调函数
iRet = C_InitSDK((char *)"192.168.1.8", 5060, (char *)"11010000002000000001", (char *)"11010000002000000001", (char *)"12345678a", enventcallback);
printf("1.InitSDK return :%d\n", iRet);
//等待资源推送
while (true)
{
if (bGetLoaclRes)
break;
Sleep(1*1000);
}
Sleep(5*1000);
//获取已经推送的所有资源
printf("1.GetLocalResource Body:%s\n", C_GetLocalResource(NULL));
//摄像机配置的28181地址编码
char ChanPubID1[] = "11010000001321000001";
//查询设备状态和信息
printf("2.query device status:%s", C_QueryDevInfo(ChanPubID1, QUERY_DEVICE_STATUS));
printf("3.query device info:%s", C_QueryDevInfo(ChanPubID1, QUERY_DEVICE_INFO));
//开始实时视频1 ID需要自己根据推送获取
long lrealhandle1 = C_RealVideoStart(ChanPubID1, streamcallback, userdata1);
printf("RealVideoStart lrealhandle:%ld\n", lrealhandle1);
//Sleep(1*1000);
//开始实时视频2 ID需要自己根据推送获取
// long lrealhandle2 = C_RealVideoStart(ChanPubID1, streamcallback, userdata2);
// printf("RealVideoStart lrealhandle:%ld\n", lrealhandle2);
// Sleep(1000*1000);
//停止实时视频1
// if (lrealhandle2 > 0)
// C_RealVideoStop(lrealhandle2);
//ptz test
Test_PTZ(ChanPubID1, 1000);
Sleep(5*1000);
//停止实时视频2
Sleep(10*1000);
if (lrealhandle1 > 0)
{
C_RealVideoStop(lrealhandle1);
}
Sleep(3*1000);
char his_starttime[] = "2018-01-24T10:00:00";
char his_endttime[] = "2018-01-24T11:00:00";
//异步返回历史视频查询结果
C_HisVideoQuery(ChanPubID1, his_starttime, his_endttime);
#if 1
Sleep(5*1000);
//点播历史视频
long hishandle1 = C_HisVideoStart(ChanPubID1, his_starttime, his_endttime, streamcallback, 2048, 0);
printf("C_HisVideoStart hishandle1:%d\n", hishandle1);
Sleep(5*1000);
if (hishandle1 > 0)
{
//点播控制
// 1.点播慢放控制
C_HisVideoCtrl(hishandle1, 3, 2);
Sleep(5);
// 2.点播暂停控制
C_HisVideoCtrl(hishandle1, 4, 0);
Sleep(10);
// 3.点播播放控制
C_HisVideoCtrl(hishandle1, 1, 0);
Sleep(10);
// 4.点播快放控制
C_HisVideoCtrl(hishandle1, 2, 4);
Sleep(10);
// 5.点播跳转控制
C_HisVideoCtrl(hishandle1, 5, 500);
Sleep(10);
// 6.点播快放控制
C_HisVideoCtrl(hishandle1, 1, 0);
}
Sleep(10*1000);
//结束点播控制
C_HisVideoStop(hishandle1);
#endif
Sleep(10*1000);
C_UnInitSDK();
return 0;
}
windows版本的28181SDK下载地址:
http://download.csdn.net/download/songxiao1988918/10221258