國標GB28181設備終端(國標攝像機、國標單兵設備)實現方案流程概述

國標GB/T 28181協議的逐步普及,解決了海康、大華、宇視等各大廠家設備協議統一的問題,尤其是在主動註冊到平臺這一塊的協議上,非常好地解決了所有有線、無線、4G、5G設備的統一接入協議的問題,GB/T 28181設備的普及反向帶動了國標28181平臺的發展。

國標GB/T 28181協議從2011年協議擬定以來,分別迭代發展了2014版和最新的2016版,國標GB/T 28181協議在各個方面已經非常完善,基本上能夠滿足目前互聯網各種網絡環境的基本要求,注意,是基本要求,哈哈,尤其是走公網的國標GB28181流,效果都一般般。。。

GB28181採用的是SIP信令+RTP流的方式進行傳輸,基本上大部分的即時通信也採用的是這種信令+流媒體的協議組合方式,所以,信令本身是沒有太多問題的,主要還是各個攝像機廠家由於早期協議的不明確以及平臺的實現,導致國標效果的一般。

國標GB28181協議目前不但可以應用於公安行業,還可以用在很多互聯網直播的場景,例如平安工地(工地沒法拉網線,最好就是國標+4G)、車載監控(車載NVR+4G)、單兵設備(手持終端+4G無線網絡),那麼,如果實現一套有效的國標GB28181協議的終端,是開發終端設備非常必須的。

國標GB28181設備端的實現方案目前公開的還不是很多,但國標GB28181終端設備支持將會越來越多的,尤其是安卓Android終端支持GB28181,引用CSDN另一位博主的大概思路,可以非常明確地表達整個國標GB28181設備端的實現流程:
國標GB28181設備端

圖引自https://blog.csdn.net/Zhu__/article/details/90967400

按照上面的思路,可以實現一套完善的國標GB28181設備協議流程,包括信令和流媒體,主要的功能包括:

  • 支持GB28181 2016版;
  • 支持H.264 / H.265 PS打包過程;
  • 支持音頻;
  • 支持對講;
  • 支持訂閱、通知;
  • 支持錄像回放、錄像下載;
  • 支持音頻廣播;
  • 支持跨平臺;
  • 支持嵌入式設備;

Github(https://github.com/tsingsee/EasyGBD)接口定義:

#ifndef __GB28181_DEVICE_API_H__
#define __GB28181_DEVICE_API_H__


#ifdef _WIN32
#include <winsock2.h>
#define GB28181DEVICE_API  __declspec(dllexport)
#define GB28181DEVICE_APICALL  __stdcall
#define WIN32_LEAN_AND_MEAN
#else
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#define GB28181DEVICE_API __attribute__ ((visibility("default")))
#define GB28181DEVICE_APICALL 
#define CALLBACK
#endif

typedef enum __GB28181_DEVICE_EVENT_TYPE_ENUM_T
{
	GB28181_DEVICE_EVENT_CONNECTING = 1,		//連接中
	GB28181_DEVICE_EVENT_REGISTER_ING,			//註冊中
	GB28181_DEVICE_EVENT_REGISTER_OK,			//註冊成功
	GB28181_DEVICE_EVENT_REGISTER_AUTH_FAIL,	//用戶驗證失敗
	GB28181_DEVICE_EVENT_START_AUDIO_VIDEO,		//請求推送音視頻
	GB28181_DEVICE_EVENT_STOP_AUDIO_VIDEO,		//請求停止推送音視頻
	GB28181_DEVICE_EVENT_TALK_AUDIO_DATA,		//對端對講數據

	GB28181_DEVICE_EVENT_DISCONNECT				//已斷線
}GB28181_DEVICE_EVENT_TYPE_ENUM_T;

#define MAX_CH_NUMS     8
typedef struct __GB28181_DEVICE_INFO_T
{
	char	server_ip[128];     // server ip
	int		server_port;        // server port
	char    server_id[32];      // server id
	char	server_domain[64];  // server domain
	char	device_id[32];      // device id
	int     channel_nums;       // channel numbers
	char    channel_id[MAX_CH_NUMS][32]; // channel id
	char	password[32];	    // password
	int		protocol;			// 0 - udp; 1 - tcp
	int		reg_expires;        // sip reg user expires, unit is second
	int		heartbeat_interval; // gb28181 heartbeat interval, unit is second
	int		heartbeat_count;    // gb28181 heartbeat count
	int     log_enable;         // log enable flag
	int     log_level;          // log level(0:TRACE,1:DEBUG,2:INFO,3:WARNING,4:ERROR,5:FATAL)
}GB28181_DEVICE_INFO_T;

typedef int (CALLBACK* GB28181DeviceCALLBACK)(void *userPtr, int eventType, char *eventParams, int paramLength);

//激活
#ifdef ANDROID
int GB28181DEVICE_API	libGB28181Device_Activate(char* license, char* userPtr);
#else
int GB28181DEVICE_API	libGB28181Device_Activate(char* license);
#endif

//創建GB28181設備端資源
/*
pDeviceInfo:		設備端信息, 爲NULL則從當前目錄中讀取config.xml
callbackPtr:		回調函數
userPtr:			用戶自定義指針,用於在回調函數中回調給調用者
*/
int GB28181DEVICE_API	libGB28181Device_Create(GB28181_DEVICE_INFO_T *pDeviceInfo, GB28181DeviceCALLBACK callbackPtr, void *userPtr);

int GB28181DEVICE_API	libGB28181Device_Create2(char* serverIP, int serverPort, char* serverId, char* serverDomain,
													char* deviceId, char* channelId, char* password, int protocol,
													int regExpires, int heartbeatInterval, int heartbeatCount,
													GB28181DeviceCALLBACK callbackPtr, void* userPtr);

//指定視頻格式
/*
codec:
		#define EASY_SDK_VIDEO_CODEC_H264	0x1C		//H264
		#define EASY_SDK_VIDEO_CODEC_H265	0xAE		//H265
width:	可選
height:	可選
framerate: 可選
*/
int GB28181DEVICE_API	libGB28181Device_SetVideoFormat(int codec, int width, int height, int framerate);

//指定音頻格式
/*
audioDstCodec:
		#define EASY_SDK_AUDIO_CODEC_AAC	0x15002		// AAC
		#define EASY_SDK_AUDIO_CODEC_G711U	0x10006		// G711 ulaw
		#define EASY_SDK_AUDIO_CODEC_G711A	0x10007		// G711 alaw
samplerate:		採樣率
channels:		聲道數
bitPerSample:	採樣精度
*/
int GB28181DEVICE_API	libGB28181Device_SetAudioFormat(int audioDstCodec, int samplerate, int channels, int bitPerSamples);


//推送視頻數據
/*
framedata:	視頻幀數據
framesize:	視頻幀大小
keyframe:	關鍵幀填1, 否則填0
*/
int GB28181DEVICE_API	libGB28181Device_AddVideoData(char* framedata, int framesize, int keyframe);

//推送音頻數據
/*
audioSrcCodec:	當前音頻源格式
		#define EASY_SDK_AUDIO_CODEC_G711U	0x10006		// G711 ulaw
		#define EASY_SDK_AUDIO_CODEC_G711A	0x10007		// G711 alaw

		如果audioSrcCodec和libGB28181Device_SetAudioFormat中指定的audioDstCodec不一致時, 則會自動進行轉換, 
		但僅限於從PCM轉爲G711,即此處的audioSrcCodec爲PCM, 而audioSrcCodec爲G711
framedata:	音頻幀數據
framesize:  音頻幀大小
nbsamples:	同音頻幀大小
*/
int GB28181DEVICE_API	libGB28181Device_AddAudioData(int audioSrcCodec, char* framedata, int framesize, int nbsamples);


//釋放資源
int GB28181DEVICE_API	libGB28181Device_Release();


#ifdef ANDROID
#include <jni.h>
extern JavaVM *g_vm;
#endif

#endif

EasyGBD安卓Android國標GB28181終端效果:

EasyGBD國標GB28181安卓端
EasyGBS

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章