國標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設備協議流程,包括信令和流媒體,主要的功能包括:
- 支持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終端效果: