天天看點

EasyGBS平台語音級聯出現卡住假死的狀态,該如何解決?

國标視訊雲服務EasyGBS支援裝置/平台通過國标GB28181協定注冊接入,并能實作視訊的實時監控直播、錄像、檢索與回看、語音對講、雲存儲、告警、平台級聯等功能。平台部署簡單、可拓展性強,支援将接入的視訊流進行全終端、全平台分發,分發的視訊流包括RTSP、RTMP、FLV、HLS、WebRTC等格式。

EasyGBS平台語音級聯出現卡住假死的狀态,該如何解決?

在級聯功能上,EasyGBS可通過國标GB28181協定向上級平台級聯,也能支援第三方平台通過國标GB28181協定級聯到EasyGBS,實作資料的互通共享,并且也能支援語音級聯功能。

今天和大家分享一下我們在開發語音級聯時遇到的問題以及解決辦法。

在開發EasyGBS級聯語音時,EasyGBS配置完上級平台的資訊,選擇支援語音的通道注冊到上級,在上級平台播放級聯上來的通道,使用https通路并進行對講,當第一次語音對講時,裝置不出聲,并一直處于卡住假死的狀态:

EasyGBS平台語音級聯出現卡住假死的狀态,該如何解決?
EasyGBS平台語音級聯出現卡住假死的狀态,該如何解決?

于是進行抓包分析:

EasyGBS平台語音級聯出現卡住假死的狀态,該如何解決?

發現語音通知指令​

​<CmdType>Broadcast</CmdType>\n​

​和裝置初始化注冊指令​

​CSeq: 15 INVITE​

​都正常,包括上級平台的語音都已經成功發送到下級平台,是以,可以判斷是下級平台在向裝置發送語音時,出現了問題。

EasyGBS平台語音級聯出現卡住假死的狀态,該如何解決?
for {

      select {

      //等待級聯的udp連結建立完成

      case audioOnOff := <-Server.UacAudioOnOff[key]:

        dataConn := Server.UacAudioUdpConn[key]

        if dataConn != nil {

          Server.UacAudioUdpConn[key] = nil

          bufUDP := make([]byte, 102400)      
EasyGBS平台語音級聯出現卡住假死的狀态,該如何解決?

由于是先取值在指派,取值的時候還沒有指派,是以,雖然UacAudioOnOff是通道,但是因為取值的時候是nil,是以,在之後即使指派過後,這邊也不會取到了。

可參照如下代碼進行優化:

EasyGBS平台語音級聯出現卡住假死的狀态,該如何解決?

添加如下代碼:

audioOnOffChan := Server.UacAudioOnOff[key]

  if audioOnOffChan == nil {

    audioOnOffChan = make(chan bool)

    Server.UacAudioLock.RLock()

    Server.UacAudioOnOff[key] = audioOnOffChan

    Server.UacAudioLock.RUnlock()

  }      

在取值之前進行一次值判斷即可。