用android實現GB28181的視音頻前端設備

      目前幾乎主流的廠家,比如接入海康、大華、華爲、科達、宇視等等各家攝像頭都支持GB28181的協議,但是如果沒有攝像頭怎麼辦?需要買嗎?答案是否定的,其實我們可以用android手機寫一個app支持國標28181協議。

      國標28181協議對於前端設備(就是攝像機)而言,主要就是實現註冊與退出註冊,會話保活,返回目錄查詢結果,響應invite,返回錄像查詢結果,響應錄像回放,語音對講。

       當然用手機做,要做就支持4G/5G。我們得考慮媒體流網絡穿透啦,網絡穿透是很簡單的,P2P採用ace,用服務器轉發就可以直接用rtp端口反向給服務器發數據報即可。

       整個過程還是一如既往的簡單可控,針對gb28181的協議進行開發。這裏主要說一下重點部分,語音對講,剛實現時,其實是有迴音的和噪音的,所以對手機端採集的聲音去噪和回聲消除其實是很重要的。

       對於迴音的消除,好在現在手機都已經很好的從硬件層面支持了,我們直接使用android的AcousticEchoCanceler進行回聲消除,首先判斷手機是否支持AcousticEchoCanceler,但是我想到9102年底了,找到不支持的手機很難了吧,如果你的手機中了大獎確實不支持,可以使用webrtc的aec功能,這個幾年前做過,用webrtc的aec一定要計算好延時,保證輸入和輸出的音頻數據。我們這裏只講支持AcousticEchoCanceler的情況,同樣作爲回聲消除功能,則需要傳入AudioRecord的信息,只需要傳遞其sessionid即可,然後就可以開啓回聲消除了,代碼如下:

    private AcousticEchoCanceler acousticEchoCanceler;

    public void initAEC() {
        if (AcousticEchoCanceler.isAvailable()) {
            if (acousticEchoCanceler == null) {
                acousticEchoCanceler = AcousticEchoCanceler.create(getAudioSessionId());
                Log.d(TAG, "initAEC: ---->" + acousticEchoCanceler + "\t" + getAudioSessionId());
                if (acousticEchoCanceler == null) {
                    Log.e(TAG, "initAEC: ----->AcousticEchoCanceler create fail.");
                } else {
                    acousticEchoCanceler.setEnabled(true);
                }
            }
        }
    }

       去噪採用的webrtc的audio_processing模塊,因爲是c++代碼,以下部分在jni實現,WebRtcNs_Process函數可以進行很好的去噪,只要知道通道,採樣率就可以了,首先初始化創建去噪句柄,代碼如下:

      

		if (WebRtcNs_Create(&denoise_handle))
		{
			denoise_handle = NULL;
			return S_FALSE;
		}

		WebRtcNs_Init(denoise_handle, dwSampleRate);
		WebRtcNs_set_policy(denoise_handle, 3);

      然後就可以愉快的去噪了:

    

WebRtcNs_Process(denoise_handle, src_buf, 0, des_buf, 0);

     按照以上思路,我們完成了android 上的gb28181攝像機。支持4G/5G網絡,因爲GB28181的設備屬性裏除了行政區劃外,還有經緯度等位置信息的,所以我們也支持了手機的定位信息。如下圖:

 

通過這種方式,以後調試gb28181協議不需要用各種設備了,簡潔,方便。

 

更多信息

e-mail: [email protected]

web:www.founu.com

 

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