一、背景描述:

近日,项目现场传来消息,终端音频解码声音不正常,有爆破音。

我们的项目的视音频使用RTP协议封装,视频使用H.264格式,音频使用G.711格式,使用UDP发送接收。

音频流传输是这样的:

终端A -> 流媒体服务器 -> 终端B

在现场的同事,在流媒体服务器上面进行了抓包,流媒体服务器收到的音频流、发出去的音频流,解出来的声音都没有问题。

二、如何从RTP包中提取音频数据

1、拿到.pcap文件后,使用wireshark打开

2、解码为RTP:此时还是现实UDP包,点击任意一个UDP包,鼠标右键,Decode As,窗口右侧列表总选择RTP

3、查看流信息:菜单 Telephony->rtp->stream analysis

4、保存.AU文件:在弹出窗口中,可以看到这个流的统计信息,包括丢包、乱序等,点击左下角按钮save payload as,选择.au

5、收听.AU文件:可以使用VLC直接打开,也可以使用audacity打开并且查看波形

三、分析PCM数据

既然服务器发出去的流没有问题,那么只能从终端上面找原因了。

终端设备是嵌入式设备,使用嵌入式linux系统,音频采集、播放使用ALSA接口,编解码使用软件模块。

由于设备不在身边,不能操作串口,所以我先选择了修改代码,在ALSA播放线程,保存音频解码后的PCM数据。

保存方法就是直接将收到的数据写入一个文件中。

1、保存文件代码

FILE *fp = NULL;
if (!fp)
fp = fopen("./audio_dec.pcm", "wb");
fwrite(str_buf, strlen(str_buf), 1, fp);
fflush(fp);

2、使用audacity打开

打开audacity

文件->导入->原始数据->选择文件

窗口选择 16bitpcm、小端、8K

四、分析G.711数据

发现PCM数据与线程播放效果一致,有问题。

那么再往上追查,在G.711解码线程中保存rtp解包后的G.711数据

使用audacity打开的方法与打开PCM差不多,唯一的区别是原来选择16bitPCM那里,选择U-law

通过分析,这个G711数据也有问题,那么问题基本可以定位在设备收流和rtp解包这两块儿了。

五、设备上面抓包

需要在嵌入式设备上面抓包,需要下载并交叉编译tcpdump

可以将tcpdump命令在程序中传递给shell执行

1、传递shell命令

char temp[128];
FILE* cmdFile;
memset(temp, 0, sizeof(temp));
sprintf(temp, "linux shell cmd &");
cmdFile = popen(temp, "r");
pclose(cmdFile);

2、开始抓包

./tcpdump -i eth0 -w port_10006_recv.pcap -n -s0 udp port 10006 -C 10 &

3、停止抓包

killall tcpdump

将抓到的pcap文件使用wireshark打开,解包、流分析(参照‘二、从RTP中提取音频数据’)

查看 Sequence errors(乱序) 和 Lost RTP packets(丢包) 这两项。

发现,设备中收到的流,乱序率达到了40%,没有丢包。

而在终端rtp解包代码中,是不处理乱序的,直接解包后进行G.711解码,所以乱序的音频解码后,声音就不正常了。

后续文章描述如何处理乱序问题。

RTP音频流分析以及乱序问题的解决方法(一)相关推荐

  1. RTP音频流分析以及乱序问题的解决方法(二)

    前面文中描述了打包格式为RTP,负载为G.711的音频流的分析方法. 并且得知了设备收到的RTP流有严重的乱序情况. 那么,发送端发出的流是正常的,接收端收到的流却乱序严重,这是什么原因呢? 一.查看 ...

  2. RocketMQ消息乱序场景及解决方法

    消息乱序也是RocketMQ中的一个常见问题,那么到底为什么会出现消息乱序呢? 首先我们知道在RocketMQ的Topic中,会有多个MessageQueue作为数据分片,每个MessageQueue ...

  3. php保存成乱序,PHP实现断点续传乱序合并文件的方法

    本文实例讲述了PHP实现断点续传乱序合并文件的方法.分享给大家供大家参考,具体如下: 分割成多个文件发送,由于网络原因并不上先发就能发接收到.所以我们不能按顺序合并. 分割文件源码前面一篇文章< ...

  4. 超详细分析Windows变慢原因及解决方法

    谁都希望计算机一开机就可以立即进入Windows 系统而不用等待,或者是系统在使用的时候不会越来越慢,但由于种种原因常常使这些愿望不能实现,甚至一开机就死机或者用着用着就越来越慢的情况也经常发生.其实 ...

  5. 用Python进行文本分析时出现UnicodeDecodeError错误的解决方法

    问题:利用Python对文本进行分析时,出现UnicodeDecodeError: 'ascii' codec can't decode byte 0xef in position 0: ordina ...

  6. 使用R语言包clusterProfiler做KEGG富集分析时出现的错误及解决方法

    使用enrichKEGG做通路富集分析时,一直报错:显示No gene can be mapped.... k <- enrichKEGG(gene = gene, organism = &qu ...

  7. android 触摸屏(TP)问题现象分析和解决方法

    1 现象描述:进入浏览器,网页放大和缩小效果差 原因分析:由于TP抖动导致该问题. 解决方法:有抖动导致放大缩小不稳定,需要开启防抖功能,在最后主动丢掉2~3个点.开启防抖会降低报点率,需要结合用户效 ...

  8. TP问题现象分析和解决方法汇总

    No.1 现象描述:进入浏览器,网页放大和缩小效果差 原因分析:由于TP抖动导致该问题. 解决方法:有抖动导致放大缩小不稳定,需要开启防抖功能,在最后主动丢掉2~3个点. 开启防抖会降低报点率,需要结 ...

  9. 恒讯科技分析香港虚拟主机打不开网站的问题以及解决方法

    香港虚拟主机打不开网站怎么办?在很多时候我们都会面临各种各样的突发问题,下面我们就讲讲关于使用香港虚拟主机有时候打不开网站的问题,分析具体原因并给出解决方法. 香港虚拟主机网站打不开的问题及解决方法 ...

最新文章

  1. Java学习lesson 09
  2. IMXRT 分散加载文件 修改OCRAM,DTCM、ITCM大小
  3. 算法心经.数学的应用.积分的应用
  4. 高仿真的类-DefaultListableBeanFactory
  5. pythonplc曲线_PLC的编程策略:面向对象编程和梯形图逻辑之比较
  6. 前端学习(2425):复习
  7. JavaScript 表单专题
  8. H264帧的分析sps pps
  9. leetcode-125 Valid Palindrome
  10. Spring Cloud微服务下的权限架构调研
  11. 面向业务的企业元数据管理
  12. Keil代码折来叠功能显示与隐藏!!!
  13. 拼音四线三格图片_一年级拼音总结,请查收
  14. 2.5 Moblin项目提供的开发工具
  15. 结巴(jieba)分词的使用-Java实现
  16. 一次Python爬虫实战,解决反爬问题!
  17. 打包软件一键安装_InstallShield2015PremierComp打包软件安装步骤
  18. 瑞星2010暴力公测说明什么问题?
  19. 用 C# 编写 C# 编译器,先有鸡还是先有蛋?
  20. 思维导图学习---计算机相关基础思维导图(1)

热门文章

  1. 数学智力题 武士数独题目_这5道数学智力题,“虐哭”很多家长,难倒众多大学生...
  2. NLP入门(九)词义消岐(WSD)的简介与实现
  3. 孩子成长-拒绝的勇气
  4. 黑马程序员——基础学习感悟总结...
  5. MATLAB人脸识别疫情防护门禁系统
  6. 怎么让html网页动态效果,从html制作动态网页
  7. 阿里云云计算专业认证考试备考指南
  8. Gophers如何准备面试?
  9. 为啥吐槽导师的帖子几乎全是理工科?文科的干嘛去了?
  10. Scratch(四十七):歌唱国歌