做網(wǎng)站seo優(yōu)化線上營銷策略都有哪些
技術背景
好多開發(fā)者在做國標對接的時候,首先想到的是IPC(網(wǎng)絡攝像頭),通過參數(shù)化配置,接入到國標平臺,實現(xiàn)媒體數(shù)據(jù)的按需查看等操作。
像執(zhí)法記錄儀等智能終端,跑在Android平臺,對接GB28181平臺的需求也非常大,網(wǎng)上相關demo也不少,但真正設計符合相關協(xié)議規(guī)范、功能完善、長時間穩(wěn)定運行的并不多?;诖?#xff0c;華脈智聯(lián)研發(fā)了Android平臺GB28181接入模塊,目前功能設計,總的來說,IPC有的功能要有,IPC缺失的,但是對業(yè)務訴求有要求的,也要有,比如MobilePosition實時位置上報,實時快照、本地錄像、屏幕采集、拉取RTSP或RTMP對接到GB28181平臺、實時動態(tài)水印、實時音量調(diào)節(jié)、外部編碼前后對接等:
[視頻格式]H.264/H.265(Android H.265硬編碼);
[音頻格式]G.711 A律、AAC;
[音量調(diào)節(jié)]Android平臺采集端支持實時音量調(diào)節(jié);
[H.264硬編碼]支持H.264特定機型硬編碼;
[H.265硬編碼]支持H.265特定機型硬編碼;
[軟硬編碼參數(shù)配置]支持gop間隔、幀率、bit-rate設置;
[軟編碼參數(shù)配置]支持軟編碼profile、軟編碼速度、可變碼率設置;
支持橫屏、豎屏推流;
Android平臺支持后臺service推送屏幕(推送屏幕需要5.0+版本);
支持純視頻、音視頻PS打包傳輸;
支持RTP OVER UDP和RTP OVER TCP被動模式;
支持信令通道網(wǎng)絡傳輸協(xié)議TCP/UDP設置;
支持注冊、注銷,支持注冊刷新及注冊有效期設置;
支持設備目錄查詢應答;
支持心跳機制,支持心跳間隔、心跳檢測次數(shù)設置;
支持移動設備位置(MobilePosition)訂閱和通知;
支持國標GB/T28181—2016平臺接入;
支持語音廣播及語音對講;
[實時水印]支持動態(tài)文字水印、png水印;
[鏡像]Android平臺支持前置攝像頭實時鏡像功能;
[實時靜音]支持實時靜音/取消靜音;
[實時快照]支持實時快照;
[降噪]支持環(huán)境音、手機干擾等引起的噪音降噪處理、自動增益、VAD檢測;
[外部編碼前視頻數(shù)據(jù)對接]支持YUV數(shù)據(jù)對接;
[外部編碼前音頻數(shù)據(jù)對接]支持PCM對接;
[外部編碼后視頻數(shù)據(jù)對接]支持外部H.264數(shù)據(jù)對接;
[外部編碼后音頻數(shù)據(jù)對接]外部AAC數(shù)據(jù)對接;
[擴展錄像功能]支持錄像相關功能。
技術接口設計
接口設計這塊,我們分三個部分:一個是供Publisher實例調(diào)用的接口,一個是RTP發(fā)送相關的接口,還有一個是針對語音廣播這塊,實現(xiàn)的接收RTP數(shù)據(jù)播放接口。
先說供GB28181推送實例調(diào)用的接口:
/*+++++++++++++++GB28181相關接口+++++++++++++++*/
private native long nativeCreate(String server_ip, int
port, String server_id,
String
server_domain, String device_id, String device_pwd,
String
device_name, int tcpudp, int heartbeat_interval,
int
reg_expire, String sdk_version);
private native void nativeRegister(final long ptr);
private native void nativeUnRegister(final long ptr);
/*+++++++++++++++GB28181相關接口+++++++++++++++*/
再說RTP發(fā)送相關的接口:???????
/*+++++++++++++++RTP Sender相關接口+++++++++++++++*/
public native void nativePushEncodedAudio(long handle,
int devId, byte[] data, int length);
public native void nativePushEncodedVideo(long handle,
int devId, byte[] data, int length);
/*+++++++++++++++RTP Sender相關接口+++++++++++++++*/
接收相關的接口???????:
void sip_audio_decode_cb(AVFrame * frame, void *
userdata)
{
log_print(HT_LOG_INFO,"PTT- %s start
sip_audio_decode_cb",__FUNCTION__ );
SUA * p_sua =
(SUA *) userdata;
if (NULL ==
p_sua->media_info.audio_player)
{
log_print(HT_LOG_INFO,"PTT- %s, p_sua->media_info.audio_player
is null###",__FUNCTION__ );
#ifdef ANDROID_AS
p_sua->media_info.dataQueue = new DataQueue();
p_sua->media_info.audio_player = new
OpenSlEsPlayer(p_sua->media_info.dataQueue, 8000);
p_sua->media_info.audio_player->play();
#endif
}
if
(p_sua->media_info.audio_player)
{
PcmData
*pdata = new PcmData((char *) frame->data[0], frame->nb_samples *
frame->channels * av_get_bytes_per_sample((enum
AVSampleFormat)frame->format));
p_sua->media_info.dataQueue->putPcmData(pdata);
}
}
上述接口說過之后,大家可能疑惑,信令交互呢?信令交互,我們是在Android上層實現(xiàn)。
如基礎參數(shù)配置:
GBParam(
ip =
"222.185.255.66",
port = 5060,
server_id =
"34020000002000000001",
server_domain =
"3402000000",
device_id =
"34020000001320000609",
device_pwd =
"123456",
device_name =
"GB28181 Device",
tcpudp = 0,
heartbeat_interval = 30,
reg_expire =
3600
)
信令交互處理:???????
private val engineEventHandler =
IEngineEventHandler { type, state ->
if (type ==
EventHandlerStatus.EventHandlerType.type_register) {
when
(state) {
EventHandlerStatus.RegisterState.unregister -> { //反注冊
logI("onState: id=${type.toCallTypeString()},
state=unregister($state)")
}
EventHandlerStatus.RegisterState.register_fail -> { //注冊失敗
logI("onState: id=${type.toCallTypeString()},
state=register_fail($state)")
}
EventHandlerStatus.RegisterState.register_success
-> { //注冊成功
logI("onState: id=${type.toCallTypeString()},
state=register_success($state)")
}
EventHandlerStatus.RegisterState.register_forbidden -> { //注冊失敗,udp/tcp協(xié)議不對、密碼不對等注冊參數(shù)不對
logI("onState: id=${type.toCallTypeString()},
state=register_forbidden($state)")
}
else -> {
logI("onState: id=${type.toCallTypeString()},
state=PUEVT_REG_PASS($state)")
}
}
} else {
logI("onState: id=${type.toCallTypeString()},
state=${state.toEventString()}")
}
if (type ==
EventHandlerStatus.EventHandlerType.type_call_in) { //呼入事件
when
(state) {
EventHandlerStatus.EventState.PUEVT_CALL_IN -> { //視頻監(jiān)控呼入
}
EventHandlerStatus.EventState.PUEVT_CONNECT -> { //視頻監(jiān)控接通
}
EventHandlerStatus.EventState.PUEVT_HANGUP -> { //視頻監(jiān)控掛斷
}
}
}
}
除了基礎的Camera接口外,5.0開始新的Camera2數(shù)據(jù)依舊可以正常對接,感興趣的開發(fā)者可酌情參考。