⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 myclient.cpp

📁 海康ip摄像机的sdkdemo 可在linux下获得视频并显示
💻 CPP
字号:
#include <stdio.h>#include <stdlib.h>#include <string.h>#include <stdint.h>#include <unistd.h>#include <time.h>#include <pthread.h>#include <sys/socket.h>#include <netinet/in.h>#include <arpa/inet.h>#include "hcnetsdk.h" #include "analyzedata.h"//#define ANALYZEint VIEW_NUM = 1;#define SERVER_IP "192.168.20.119" #define USER_NAME 	"admin"#define PASSWD		"12345"#define PORT		8000#define LOCAL_IP "192.168.20.2"#define LOCAL_PORT 7200#define MULTICAST_IP "224.2.213.100"#define MULTICAST_PORT "10000" #define TRUE 1#define FALSE 0#define CIF_WIDTH 176#define CIF_HEIGTH 144#define MAXCHANNUM 3int32_t glUserID = -1;int32_t glRealHandle[MAXCHANNUM] = {-1};int bGetSysHeader[MAXCHANNUM] = {0};int32_t glVoiceHandle = -1; int32_t gbExit = 1;uint32_t MessCallBack(int32_t lCommand, char *sDVRIP, char *pBuf, uint32_t dwBufLen){	int32_t lIndex = -1;	int i;	char timestamp[30] = {0};	char frontID[36] = {0};   	if(lCommand < EXCEPTION_EXCHANGE)	{         		fprintf(stderr, "lCommand[%x], sDVRIP[%s], pBuf[%s], dwBufLen[%d]\n",				lCommand, sDVRIP, pBuf, dwBufLen);#ifdef SDK_ALCATEL		if (lCommand == COMM_ALARM) {#ifdef ALCATEL_FRONTIDCFG			fprintf(stderr, "ALARM:FrontID:");			for (i=0;i<32;i++)				fprintf(stderr, "%d", *(pBuf+i));			fprintf(stderr, "\n\r");			fprintf(stderr, "ALARM:AlarmType:%d\n", 					((LPNET_DVR_ALARMINFO)(pBuf+32))->dwAlarmType);#ifdef SDK_ALCATEL_DX			if (((LPNET_DVR_ALARMINFO)(pBuf+32))->dwAlarmType == 0)				fprintf(stderr, "ALARM:AlarmStatus:%s\n", 						((LPNET_DVR_ALARMINFO)(pBuf+32))->dwAlarmStatus ? 						"signal alarm occur" : "signal alarm stop");			fprintf(stderr, "ALARM:Alarm Code:");			for (i=0;i<6;i++) {				fprintf(stderr, "%d", ((LPNET_DVR_ALARMINFO)(pBuf+32))->alarmCode[i]);			}			fprintf(stderr, "\n\r");#endif#else			fprintf(stderr, "ALARM:AlarmType:%d\n", 					((LPNET_DVR_ALARMINFO)pBuf)->dwAlarmType);#ifdef SDK_ALCATEL_DX			if (((LPNET_DVR_ALARMINFO)pBuf)->dwAlarmType == 0)				fprintf(stderr, "ALARM:AlarmStatus:%s\n", 						((LPNET_DVR_ALARMINFO)pBuf)->dwAlarmStatus ? 						"signal alarm occur" : "signal alarm stop");			fprintf(stderr, "ALARM:Alarm Code:");			for (i=0;i<6;i++) {				fprintf(stderr, "%d", ((LPNET_DVR_ALARMINFO)pBuf)->alarmCode[i]);			}			fprintf(stderr, "\n\r");#endif#endif		}#ifdef SDK_ALCATEL_DX		else if (lCommand == COMM_VIDEOSTATUS) {			//memset(timestamp, 0, 30);			//memset(frontID, 0, 36);			memcpy(timestamp, ((LPNET_DVR_VIDEOSTATUS)pBuf)->TimeStamp, 20);			//memcpy(frontID, ((LPNET_DVR_VIDEOSTATUS)pBuf)->byFrontID, 32);			fprintf(stderr, "VIDEOSTATUS:FrontID:");			for (i=0; i<32; i++)				fprintf(stderr,"%d ", ((LPNET_DVR_VIDEOSTATUS)pBuf)->byFrontID[i]);			fprintf(stderr, "\n\r");			fprintf(stderr, "VIDEOSTATUS:TimeStamp:%s\n", timestamp); 			for (i=0; i<MAX_CHANNUM; i++)				fprintf(stderr, "VIDEOSTATUS:Channel[%d]:status:%s\n", i+1, 						((LPNET_DVR_VIDEOSTATUS)pBuf)->status[i] ? "Normal" : "Frame Lose");		}#endif#endif	}    	else    	{    		lIndex = *((int32_t *)pBuf);    		switch (lCommand)      		{    			case EXCEPTION_EXCHANGE:    				printf("DVR[%s] network exception\n", sDVRIP);    				break;    			case EXCEPTION_AUDIOEXCHANGE:    				printf("lIndex[%d] audioexchange exception\n", lIndex);    				break;    			case EXCEPTION_ALARM:    				printf("lIndex[%d] alarm exception\n", lIndex);    				break;    			case EXCEPTION_PREVIEW:    				printf("lIndex[%d] preview exception\n", lIndex);    				break;    			case EXCEPTION_SERIAL:    				printf("lIndex[%d] serial exception\n", lIndex);    				break;	    			default:    				break;		}	}          return 1;}#ifdef ANALYZEvoid *GetFrameThread(void * pParam){	int i = *(int *)pParam;	PACKET_INFO packet;	while(gbExit)	{		if(AnalyzeDataGetPacket(i, &packet) == 0)		{			fprintf(stderr,         			"lRealHandle[%d]: Get StreamData! Type[%d], BufSize[%d]\n",        			i, packet.nPacketType, packet.dwPacketSize);         	}        	usleep(10);	}}#endifvoid Wait(){	printf("\n======== Press 'q' to quit  ============\n");	do	{		sleep(1);	}	while(getc(stdin) != 'q');  }int socket_create( char *mode, char *host, int port, char *local ){  int opt;  int sock;  struct sockaddr_in addr;    if( strcmp( mode, "udp" ) != 0 && strcmp( mode, "multicast" ) != 0 ) return -1;    memset( &addr, 0, sizeof(addr) );  addr.sin_family = AF_INET;  addr.sin_addr.s_addr = inet_addr( host );  addr.sin_port = htons( port );  if( addr.sin_addr.s_addr == INADDR_ANY && *host != '0' )  {    //���ɴ���������������ַ�ķ���    return -1;  }  sock = socket( AF_INET, SOCK_DGRAM, 0 );  if( sock < 0 ) return -1;  opt = 1; setsockopt( sock, SOL_SOCKET, SO_REUSEADDR, &opt, sizeof(opt) );    if( IN_MULTICAST( ntohl(addr.sin_addr.s_addr) ) )  {    struct ip_mreq cmd;    opt = 15; setsockopt( sock, IPPROTO_IP, IP_MULTICAST_TTL, &opt, sizeof(opt) );    opt = 1; setsockopt( sock, IPPROTO_IP, IP_MULTICAST_LOOP, &opt, sizeof(opt) );    addr.sin_addr.s_addr = inet_addr( local ); //INADDR_ANY;    if( bind( sock, (struct sockaddr *)&addr, sizeof(addr) ) < 0 )    {      fprintf( stderr, "Socket: unable BIND to address [%s:%d]\r\n", inet_ntoa( addr.sin_addr ), ntohs( addr.sin_port ) );      close( sock );      return -1;    }    cmd.imr_multiaddr.s_addr = inet_addr( host );    cmd.imr_interface.s_addr = inet_addr( local ); //INADDR_ANY;//inet_addr( "192.168.100.47" );    if( setsockopt( sock, IPPROTO_IP, IP_ADD_MEMBERSHIP, &cmd, sizeof(cmd) ) < 0 )    {      fprintf( stderr, "Socket: unable ADD MEMBERSHIP to address [%s/%s]\r\n", host, inet_ntoa(cmd.imr_interface) );      close( sock );      return -1;    }    else    {      fprintf( stderr, "Socket: add to membership %s/%s\r\n", host, inet_ntoa(cmd.imr_interface) );    }  }  else  {/*    if( bind( sock, (struct sockaddr *)&addr, sizeof(addr) ) < 0 )    {            close( sock );            return -1;    }*/  }    return sock;}void socket_destroy( int sock, char *host, char *local ){	unsigned long addr = inet_addr( host );	if( IN_MULTICAST( ntohl(addr) ) )	{		struct ip_mreq cmd;		cmd.imr_multiaddr.s_addr = addr;		cmd.imr_interface.s_addr = inet_addr( local );		setsockopt( sock, IPPROTO_IP, IP_DROP_MEMBERSHIP, (const void *)&cmd, sizeof(cmd) );	}	close( sock );}void RealDataCallBack (int32_t lRealHandle,                             uint32_t dwDataType,                             char *pBuffer,                            uint32_t dwBufSize,                            uint32_t dwUser){	if(dwDataType == NET_DVR_SYSHEAD)	{		bGetSysHeader[dwUser] = 1;	}#ifdef ANALYZE	AnalyzeDataInputData(dwUser, (unsigned char *)pBuffer, dwBufSize);#else    	fprintf(stderr,         "lRealHandle[%d]: Get StreamData! Type[%d], BufSize[%d], dwUser[%d]\n",       	lRealHandle, dwDataType, dwBufSize, dwUser);		//printf("%s\n", pBuffer);//  Multicast Send  //int fd_udp = socket_create( "udp", LOCAL_IP, atoi(source_addr), LOCAL_IP );  //p2 = strchr( target_addr, ':' ); *p2 = '\0'; p2++;  int fd_multicast = socket_create( "multicast", MULTICAST_IP, atoi(MULTICAST_PORT), LOCAL_IP );  if( fd_multicast < 0 ) printf("multicast error");  struct sockaddr_in target;  memset( &target, 0, sizeof(target) );  target.sin_family = AF_INET;  target.sin_addr.s_addr = inet_addr( MULTICAST_IP );  target.sin_port = htons( atoi(MULTICAST_PORT) );  //ѭ�����ݽ���#define NET_BUFFER_SIZE   102400 //��������СΪ100KB#define VIDEO_PACKAGE_SIZE  4096  //hik��Ƶ���ְ���С  struct sockaddr_in addr;  int addr_len;  //char buffer[NET_BUFFER_SIZE];    int recv_len = 0;  //���������ݴ�С  int len;  //int count = 0;  int i, count, countyu;  //char *slipbuf[];  count = dwBufSize/VIDEO_PACKAGE_SIZE;  countyu = dwBufSize%VIDEO_PACKAGE_SIZE;  fprintf( stderr, "\r\nstart transform udp data ..." );  //for (i=0; i<count; i++) {  //slipbuf[i] = pBuffer+i*4096;  //}  for (i=0; i<count; i++) {    len = sendto( fd_multicast, pBuffer+i*4096, 4096, 0, (struct sockaddr *)&target, sizeof(target) );  }  sendto( fd_multicast, pBuffer+count*4096, countyu, 0, (struct sockaddr *)&target, sizeof(target));  //�˳�����  //socket_destroy( fd_udp, local_addr, local_addr );  socket_destroy( fd_multicast, MULTICAST_IP, LOCAL_IP );  fprintf( stderr, "\r\ntransformer udp exited.\r\n" );#endif}void RealPlay(NET_DVR_DEVICEINFO *devInfo){	int nMode = PTOPTCPMODE;	printf("Please input link mode: [0-PTOPTCPMODE; 1-PTOPUDPMODE;3-PTOPRTPMODE]\n");	scanf("%d", &nMode );		int linkmode = nMode;//PTOPUDPMODE/*PTOPTCPMODE*/PTOPRTPMODE;	int usesdl = TRUE;	NET_DVR_CLIENTINFO clientInfo;	clientInfo.lChannel = devInfo->byStartChan;	clientInfo.lLinkMode = linkmode/* | 0x80000000*/;//sub-stream: | 0x80000000	clientInfo.hPlayWnd.x = 0;	clientInfo.hPlayWnd.y = 0;	INITINFO InitInfo;	if(usesdl)	{		//��ʾ���������Ļ���		InitInfo.uWidth = CIF_WIDTH; 		InitInfo.uHeight = CIF_HEIGTH; 	}	else	{		InitInfo.uWidth = 0;		InitInfo.uHeight = 0;	}	//�趨������С	if(!NET_DVR_DrawAreaInit(InitInfo))	{		printf("DrawAreaInit failed\n");		return ;	}	if(usesdl)	{		//�趨���Ŵ��ڴ�С		clientInfo.hPlayWnd.uWidth = CIF_WIDTH-1;		clientInfo.hPlayWnd.uHeight = CIF_HEIGTH-1;	}	else	{		clientInfo.hPlayWnd.uWidth = 0;		clientInfo.hPlayWnd.uHeight = 0;	}		//�鲥����ַ	clientInfo.sMultiCastIP = "234.5.6.7"; 		int i;		//char filename[80] = {0};	if (devInfo->byChanNum > 1)	//ͨ������Ƿ�����1	{		VIEW_NUM = 1;  //ͨ���������1�����޸�	}	else	{		VIEW_NUM = 1;	}	for(i=0; i<VIEW_NUM; i++)    	{        	clientInfo.lChannel = devInfo->byStartChan + i;        	if(usesdl)		{			//���Ż��������Ͻ�����			clientInfo.hPlayWnd.x = CIF_WIDTH * (i % 2) ;        		clientInfo.hPlayWnd.y = CIF_HEIGTH * (i / 2);	        	}#ifdef ANALYZE 		pthread_attr_t attr;		pthread_attr_init(&attr);		pthread_attr_setdetachstate(&attr, PTHREAD_CREATE_DETACHED);			gbExit = 1;		char reg[1] = {0};		if ( pthread_create( &hMainThread, &attr, GetFrameThread, (void *)&i ) < 0 )		{	    				return ;		} 		AnalyzeDataOpenStream(i);#endif 			//��ʼ���ţ����ص�ǰ�����ľ���        	glRealHandle[i] = NET_DVR_RealPlay(glUserID, &clientInfo);        	if(glRealHandle[i] < 0)         	{        		printf(" channel:%d RealPlay failed \n", clientInfo.lChannel);        		return ;        	}		//printf("glRealHandle:%d\n", glRealHandle[i]);        	#if 0        	//		NET_DVR_SaveRealData(glRealHandle[i], "real.mp4");  /* to set callback function */		//���ûص��������û��Լ������ͻ����յ�������            	NET_DVR_SetRealDataCallBack(glRealHandle[i], RealDataCallBack, i);#endif		uint32_t BrightValue;		uint32_t ContrastValue;		uint32_t SaturationValue;		uint32_t HueValue; 		//��ȡ��Ƶ����           	NET_DVR_ClientGetVideoEffect(glRealHandle[i], &BrightValue, &ContrastValue, &SaturationValue, &HueValue);                 	printf("RealHandle:%d BrightValue:%d ContrastValue:%d SaturationValue:%d HueValue:%d \n",glRealHandle[i], BrightValue, ContrastValue, SaturationValue, HueValue);            }        Wait();//	sleep(10);        for(i=0; i<VIEW_NUM; i++)    	{    		if(glRealHandle[i] >= 0)    	    	{    	    		//NET_DVR_StopSaveRealData(glRealHandle[i]);    	        	NET_DVR_StopRealPlay(glRealHandle[i]);    	        	glRealHandle[i] = -1;    	        	gbExit = 0;			fprintf(stderr, "StopRealPlay \n");#ifdef ANALYZE			AnalyzeDataClose(i);#endif			    	    	}    	}    	sleep(1);    	NET_DVR_DrawAreaRelease();}const char *usageinfo[] = {"######### Usage #############","1. RealPlay.","######### End ##############"};int main(int argc, char *argv[]){	//NET_DVR_LOG dvrlog;		NET_DVR_DEVICEINFO devInfo;	int cmd = 0, usageinfolength;	char *localip = LOCAL_IP;	char *serverip = SERVER_IP;/*	printf("Please input local ip:\n");	scanf("%s", localip );	printf("Please input server ip:\n");	scanf("%s", serverip );*/		//initialization	if(!NET_DVR_Init())	//��ʼ��	{		printf("HC Clientdemo Init failed\n");		return -1;	} #ifdef ANALYZE	AnalyzeDataInit();	//��ʼ����֡#endif	#if 0		if (!NET_DVR_SetConnectTime(5000, 3)) {	//������ӳ�ʱʱ�����������		fprintf(stderr, "%d:errno[%d]\n", __LINE__, NET_DVR_GetLastError());		return -1;	}#endif	//set callback  ���ý����豸��Ϣ�Ļص�����	//NET_DVR_SetDVRMessCallBack(MessCallBack);	//start listen  ����������,�����豸�˵���Ϣ#if 1	printf("start !!!! \n");	if( !NET_DVR_StartListen(localip, LOCAL_PORT) )	{	    printf("StartListen failed ... LastError[%d]\n", NET_DVR_GetLastError());		//�ͷ���������Դ	    NET_DVR_Cleanup();	    return -1;	}#endif	#ifdef SDK_ALCATEL#if 0	if( !NET_DVR_StartUdpServer(localip, LOCAL_PORT) )	{	    printf("StartUdpServer failed ... LastError[%d]\n", NET_DVR_GetLastError());	    NET_DVR_Cleanup();	    return -1;	}#endif#endif	//�û����豸��ע��	glUserID = NET_DVR_Login(serverip, PORT, USER_NAME, PASSWD, &devInfo);		if(glUserID < 0) 	{		//��ȡ��������,����ֵ�ο�SDK�ĵ�		printf( "Login DVR failed ... LastError[%d]\n", NET_DVR_GetLastError() );			NET_DVR_StopListen();		NET_DVR_Cleanup();		return -1;	}	printf("g_lUserID = %d\n", glUserID);	printf( "DevInfo.sSerialNumber[%s],\n"		"DevInfo.byAlarmInPortNum[%d],\n"		"DevInfo.byAlarmOutPortNum[%d],\n"		"DevInfo.byDiskNum[%d],\n"		"DevInfo.byDVRType[%d],\n"		"DevInfo.byChanNum[%d],\n"		"DevInfo.byStartChan[%d].\n",	        	        devInfo.sSerialNumber,	        devInfo.byAlarmInPortNum,	        devInfo.byAlarmOutPortNum,	        devInfo.byDiskNum,	        devInfo.byDVRType,	        devInfo.byChanNum,	        devInfo.byStartChan );	usageinfolength = sizeof(usageinfo)/sizeof(*usageinfo);		for (int i = 0; i< usageinfolength; i++)				printf("%s\n", *(usageinfo+i));	while(1)	{		printf("\nPlease input number 1 or Press 88 to quit:\n");		scanf("%d", &cmd );				switch(cmd)		{			case 1:				RealPlay(&devInfo);				break;			case 88:				goto Exit;				break;			default:				printf("Wrong choices!\n");				break;		}	}	sleep(100);Exit:	NET_DVR_Logout(glUserID);  	//sleep(1);	NET_DVR_StopListen();#ifdef SDK_ALCATEL_DX	NET_DVR_StopUdpServer();#endif#ifdef ANALYZE	AnalyzeDataCleanup();#endif	printf("Cleanup\n");	NET_DVR_Cleanup();	return 1;//end}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -