随笔 - 936  文章 - 0  评论 - 3  阅读 - 30万

网络摄像头国标GB28181流媒体协议视频平台EasyGBS级联后语音对讲卡死的解决方案

最近有很多用户对EasyGBS视频平台的级联很感兴趣,我也接到了不少用户的咨询。但是在语音这一块,似乎还有点问题需要我们处理,比如上一篇解决了EasyGBS级联后语音重复的问题,处理完该问题后,继续测试的时候又出现了问题——语音对讲卡死,所以本文也来讲下该问题的排查过程。

我们将EasyGBS的上级平台配置好,并且在上级平台配置信息里选择支持语音的通道注册到上级,

然后上级平台播放级联上来的通道,https访问进行对讲,

但是此时第一次讲话,设备不会出声,一直处于卡死的状态。我们再来通过抓包分析一下。

抓包可以发现语音通知命令
Broadcast\n和设备初始化注册命令CSeq: 15 INVITE都是正常的,包括上级的语音都已经发送到下级来了,所以应该是下级在朝着设备发送语音的时候出现了问题。

1
2
3
4
5
6
7
8
for {
            select {
            //等待级联的udp链接建立完成
            case audioOnOff := <-Server.UacAudioOnOff[key]:
                dataConn := Server.UacAudioUdpConn[key]
                if dataConn != nil {
                    Server.UacAudioUdpConn[key] = nil
                    bufUDP := make([]byte, 102400)

  

由于是先取值再赋值,取值的时候还没有赋值,所以虽然这个UacAudioOnOff是通道,但是因为取值的时候是nil,所以之后即使赋值过后这边也不会取到了。

针对此问题我们对代码进行了改善如下

1
2
3
4
5
6
7
audioOnOffChan := Server.UacAudioOnOff[key]
    if audioOnOffChan == nil {
        audioOnOffChan = make(chan bool)
        Server.UacAudioLock.RLock()
        Server.UacAudioOnOff[key] = audioOnOffChan
        Server.UacAudioLock.RUnlock()
    }

  

在取值之前进行一次值判断,修改之后再次抓包则一切正常。

随后再次启动语音对讲,则没有问题了。如果大家仍然对我们EasyGBS级联比较感兴趣,可以看一下本文:EasyGBS如何实现视频流的向上级联?视频相关解决方案均可访问TSINGSEE青犀视频,可以联系我们获取演示方案,直观感受,也可随意进行下载及测试,如有疑问,欢迎随时咨询我们。

EasyDarwin开源流媒体服务器,是由国内开源流媒体团队TSINGSEE青犀视频开发和维护的一款开源流媒体平台框架。从2012年12月创建并发展至今,从原有的单服务的流媒体服务器形式,扩展成现在的云平台架构的开源项目。

posted on   EasyGBS  阅读(400)  评论(0编辑  收藏  举报
编辑推荐:
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
阅读排行:
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构
· 提示词工程——AI应用必不可少的技术
· 字符编码:从基础到乱码解决
· 地球OL攻略 —— 某应届生求职总结
< 2025年3月 >
23 24 25 26 27 28 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31 1 2 3 4 5

点击右上角即可分享
微信分享提示