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

国标协议GB28181视频平台EasyGBS采集音频摄像头无法播放该如何解决?

目前在一些项目合作的过程中,我们发现,越来越多的团队开始使用摄像头的语音对讲功能来实现服务端与设备端的音视频语音对讲与喊话。在监控系统中,语音喊话是比较实用的功能,市面上部分摄像头本身就自带拾音器,如果摄像头不带,也可以自己加装拾音器。

使用TSINGSEE青犀视频国标协议GB28181视频平台EasyGBS的用户多数都有语音喊话的需求,所以在最新的产品升级更新中,我们增加了语音喊话功能并进行项目测试。我们在测试的时候发现,国标协议GB28181视频平台EasyGBS语音喊话功能会出现采集好的音频发送到摄像头却无法播放的问题。

通过wireshark分析,在wireshark中的流数据展示如下:

从wireshark的音频波形可以看出不是一个正确的波形,经过排查是前端采集的音频的类型是pcm裸数据,但是传给摄像头的时候是把这个数据当做g711a的压缩格式去解析的所以出现错误。

我们将pcm的音频格式改为g711a文件再次传输,波形就会恢复正常。

 
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
select {
 
 
case talkdata := <-Server.TalkChan:
 
b, err := ioutil.ReadFile( "./test.g711-alaw" )
if err != nil {
fmt.Println( "ioutil ReadFile error: " , err)
return
}
ioutil.WriteFile( "./output2.g711-alaw" , b, 0666)
//retinfo := rtp.MakeParseRTP([]byte(talkdata))
//rtparr, err := ps.ConvertEs2Rtp([]byte(talkdata), 1, 0x1c, true, retinfo)
rtparr, err := ps.ConvertPCM2Rtp(b)
//rtparr, err := ps.ConvertPCM2Rtp([]byte(talkdata))
if err != nil {
fmt.Println( "发送rtperr" , err)
return
}
//retinfo := rtp.ParseRTP([]byte(talkdata))
for _, v := range rtparr {
tempint, err := transportMS.UDPConn.Write(v.Payload)
if err != nil {
fmt.Println( "发送rtperr" , err)
return
}
time.Sleep(10 * time.Millisecond)
fmt.Println( "发送tempint" , tempint)
}

  

而像本文开头提到的音频不能播放的问题也解决了。

posted on   EasyGBS  阅读(564)  评论(1编辑  收藏  举报
编辑推荐:
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
阅读排行:
· DeepSeek 开源周回顾「GitHub 热点速览」
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· AI与.NET技术实操系列(二):开始使用ML.NET
· 单线程的Redis速度为什么快?
< 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

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