做網(wǎng)站seo優(yōu)化線(xiàn)上營(yíng)銷(xiāo)策略都有哪些
技術(shù)背景
好多開(kāi)發(fā)者在做國(guó)標(biāo)對(duì)接的時(shí)候,首先想到的是IPC(網(wǎng)絡(luò)攝像頭),通過(guò)參數(shù)化配置,接入到國(guó)標(biāo)平臺(tái),實(shí)現(xiàn)媒體數(shù)據(jù)的按需查看等操作。
像執(zhí)法記錄儀等智能終端,跑在Android平臺(tái),對(duì)接GB28181平臺(tái)的需求也非常大,網(wǎng)上相關(guān)demo也不少,但真正設(shè)計(jì)符合相關(guān)協(xié)議規(guī)范、功能完善、長(zhǎng)時(shí)間穩(wěn)定運(yùn)行的并不多。基于此,華脈智聯(lián)研發(fā)了Android平臺(tái)GB28181接入模塊,目前功能設(shè)計(jì),總的來(lái)說(shuō),IPC有的功能要有,IPC缺失的,但是對(duì)業(yè)務(wù)訴求有要求的,也要有,比如MobilePosition實(shí)時(shí)位置上報(bào),實(shí)時(shí)快照、本地錄像、屏幕采集、拉取RTSP或RTMP對(duì)接到GB28181平臺(tái)、實(shí)時(shí)動(dòng)態(tài)水印、實(shí)時(shí)音量調(diào)節(jié)、外部編碼前后對(duì)接等:
[視頻格式]H.264/H.265(Android H.265硬編碼);
[音頻格式]G.711 A律、AAC;
[音量調(diào)節(jié)]Android平臺(tái)采集端支持實(shí)時(shí)音量調(diào)節(jié);
[H.264硬編碼]支持H.264特定機(jī)型硬編碼;
[H.265硬編碼]支持H.265特定機(jī)型硬編碼;
[軟硬編碼參數(shù)配置]支持gop間隔、幀率、bit-rate設(shè)置;
[軟編碼參數(shù)配置]支持軟編碼profile、軟編碼速度、可變碼率設(shè)置;
支持橫屏、豎屏推流;
Android平臺(tái)支持后臺(tái)service推送屏幕(推送屏幕需要5.0+版本);
支持純視頻、音視頻PS打包傳輸;
支持RTP OVER UDP和RTP OVER TCP被動(dòng)模式;
支持信令通道網(wǎng)絡(luò)傳輸協(xié)議TCP/UDP設(shè)置;
支持注冊(cè)、注銷(xiāo),支持注冊(cè)刷新及注冊(cè)有效期設(shè)置;
支持設(shè)備目錄查詢(xún)應(yīng)答;
支持心跳機(jī)制,支持心跳間隔、心跳檢測(cè)次數(shù)設(shè)置;
支持移動(dòng)設(shè)備位置(MobilePosition)訂閱和通知;
支持國(guó)標(biāo)GB/T28181—2016平臺(tái)接入;
支持語(yǔ)音廣播及語(yǔ)音對(duì)講;
[實(shí)時(shí)水印]支持動(dòng)態(tài)文字水印、png水印;
[鏡像]Android平臺(tái)支持前置攝像頭實(shí)時(shí)鏡像功能;
[實(shí)時(shí)靜音]支持實(shí)時(shí)靜音/取消靜音;
[實(shí)時(shí)快照]支持實(shí)時(shí)快照;
[降噪]支持環(huán)境音、手機(jī)干擾等引起的噪音降噪處理、自動(dòng)增益、VAD檢測(cè);
[外部編碼前視頻數(shù)據(jù)對(duì)接]支持YUV數(shù)據(jù)對(duì)接;
[外部編碼前音頻數(shù)據(jù)對(duì)接]支持PCM對(duì)接;
[外部編碼后視頻數(shù)據(jù)對(duì)接]支持外部H.264數(shù)據(jù)對(duì)接;
[外部編碼后音頻數(shù)據(jù)對(duì)接]外部AAC數(shù)據(jù)對(duì)接;
[擴(kuò)展錄像功能]支持錄像相關(guān)功能。
技術(shù)接口設(shè)計(jì)
接口設(shè)計(jì)這塊,我們分三個(gè)部分:一個(gè)是供Publisher實(shí)例調(diào)用的接口,一個(gè)是RTP發(fā)送相關(guān)的接口,還有一個(gè)是針對(duì)語(yǔ)音廣播這塊,實(shí)現(xiàn)的接收RTP數(shù)據(jù)播放接口。
先說(shuō)供GB28181推送實(shí)例調(diào)用的接口:
/*+++++++++++++++GB28181相關(guān)接口+++++++++++++++*/
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相關(guān)接口+++++++++++++++*/
再說(shuō)RTP發(fā)送相關(guān)的接口:???????
/*+++++++++++++++RTP Sender相關(guān)接口+++++++++++++++*/
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相關(guān)接口+++++++++++++++*/
接收相關(guān)的接口???????:
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);
}
}
上述接口說(shuō)過(guò)之后,大家可能疑惑,信令交互呢?信令交互,我們是在Android上層實(shí)現(xiàn)。
如基礎(chǔ)參數(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 -> { //反注冊(cè)
logI("onState: id=${type.toCallTypeString()},
state=unregister($state)")
}
EventHandlerStatus.RegisterState.register_fail -> { //注冊(cè)失敗
logI("onState: id=${type.toCallTypeString()},
state=register_fail($state)")
}
EventHandlerStatus.RegisterState.register_success
-> { //注冊(cè)成功
logI("onState: id=${type.toCallTypeString()},
state=register_success($state)")
}
EventHandlerStatus.RegisterState.register_forbidden -> { //注冊(cè)失敗,udp/tcp協(xié)議不對(duì)、密碼不對(duì)等注冊(cè)參數(shù)不對(duì)
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)控掛斷
}
}
}
}
除了基礎(chǔ)的Camera接口外,5.0開(kāi)始新的Camera2數(shù)據(jù)依舊可以正常對(duì)接,感興趣的開(kāi)發(fā)者可酌情參考。