RTP音频流分析以及乱序问题的解决方法(一)
一、背景描述:
近日,项目现场传来消息,终端音频解码声音不正常,有爆破音。
我们的项目的视音频使用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音频流分析以及乱序问题的解决方法(一)相关推荐
- RTP音频流分析以及乱序问题的解决方法(二)
前面文中描述了打包格式为RTP,负载为G.711的音频流的分析方法. 并且得知了设备收到的RTP流有严重的乱序情况. 那么,发送端发出的流是正常的,接收端收到的流却乱序严重,这是什么原因呢? 一.查看 ...
- RocketMQ消息乱序场景及解决方法
消息乱序也是RocketMQ中的一个常见问题,那么到底为什么会出现消息乱序呢? 首先我们知道在RocketMQ的Topic中,会有多个MessageQueue作为数据分片,每个MessageQueue ...
- php保存成乱序,PHP实现断点续传乱序合并文件的方法
本文实例讲述了PHP实现断点续传乱序合并文件的方法.分享给大家供大家参考,具体如下: 分割成多个文件发送,由于网络原因并不上先发就能发接收到.所以我们不能按顺序合并. 分割文件源码前面一篇文章< ...
- 超详细分析Windows变慢原因及解决方法
谁都希望计算机一开机就可以立即进入Windows 系统而不用等待,或者是系统在使用的时候不会越来越慢,但由于种种原因常常使这些愿望不能实现,甚至一开机就死机或者用着用着就越来越慢的情况也经常发生.其实 ...
- 用Python进行文本分析时出现UnicodeDecodeError错误的解决方法
问题:利用Python对文本进行分析时,出现UnicodeDecodeError: 'ascii' codec can't decode byte 0xef in position 0: ordina ...
- 使用R语言包clusterProfiler做KEGG富集分析时出现的错误及解决方法
使用enrichKEGG做通路富集分析时,一直报错:显示No gene can be mapped.... k <- enrichKEGG(gene = gene, organism = &qu ...
- android 触摸屏(TP)问题现象分析和解决方法
1 现象描述:进入浏览器,网页放大和缩小效果差 原因分析:由于TP抖动导致该问题. 解决方法:有抖动导致放大缩小不稳定,需要开启防抖功能,在最后主动丢掉2~3个点.开启防抖会降低报点率,需要结合用户效 ...
- TP问题现象分析和解决方法汇总
No.1 现象描述:进入浏览器,网页放大和缩小效果差 原因分析:由于TP抖动导致该问题. 解决方法:有抖动导致放大缩小不稳定,需要开启防抖功能,在最后主动丢掉2~3个点. 开启防抖会降低报点率,需要结 ...
- 恒讯科技分析香港虚拟主机打不开网站的问题以及解决方法
香港虚拟主机打不开网站怎么办?在很多时候我们都会面临各种各样的突发问题,下面我们就讲讲关于使用香港虚拟主机有时候打不开网站的问题,分析具体原因并给出解决方法. 香港虚拟主机网站打不开的问题及解决方法 ...
最新文章
- Java学习lesson 09
- IMXRT 分散加载文件 修改OCRAM,DTCM、ITCM大小
- 算法心经.数学的应用.积分的应用
- 高仿真的类-DefaultListableBeanFactory
- pythonplc曲线_PLC的编程策略:面向对象编程和梯形图逻辑之比较
- 前端学习(2425):复习
- JavaScript 表单专题
- H264帧的分析sps pps
- leetcode-125 Valid Palindrome
- Spring Cloud微服务下的权限架构调研
- 面向业务的企业元数据管理
- Keil代码折来叠功能显示与隐藏!!!
- 拼音四线三格图片_一年级拼音总结,请查收
- 2.5 Moblin项目提供的开发工具
- 结巴(jieba)分词的使用-Java实现
- 一次Python爬虫实战,解决反爬问题!
- 打包软件一键安装_InstallShield2015PremierComp打包软件安装步骤
- 瑞星2010暴力公测说明什么问题?
- 用 C# 编写 C# 编译器,先有鸡还是先有蛋?
- 思维导图学习---计算机相关基础思维导图(1)