在sip项目中,快发布的时候出现了一个奇葩问题:直接进行麦克风采集通过网络在设备上播放时,音频正常。但是如果手机连接了蓝牙,通过蓝牙采集再在设备上进行播放时,音频却是断断续续的,和我上一篇文章一样,首先我这边想要确定的是发送之前的问题还是发送之后的问题。

1、如果是发送之前的问题,那么很有可能就是采集有问题,所以我在采集回调里将音频数据写到本地,由于是PCM数据,所以这边写到本地后,用cooleditPro听了之后,发现数据是好的,并没有设备断断续续的现象。

cooleditPro分析截图.PNG

从波形看也是正常的,说明采集是正常的,数据完整,那就有可能是网络组建在组包时出了问题,所以又转去抓包

2、抓包,看发出去的数据是否正常,这边又有一个Wireshark的坑,下篇文章简单介绍一下,从抓包看,发出去的数据的确是有问题。

屏幕快照 2019-07-02 下午2.39.35.png

很明显的数据断断续续,所以我又特地抓了正常数据的包进行对比。

屏幕快照 2019-07-02 下午2.48.21.png

Wireshark坑:直接使用Wireshark抓取手机包时,由于发送在ms级别,导致抓包的时间戳不准确,计算两次数据发送的间隔会有误差,大的有1000ms左右,所以建议以后使用tcpdump抓包

sudo tcpdump -i rvi0 -s 0 -w ./Desktop/xxx.pcap

所以这个问题比较就只能出在采集之后,发出去之前。反正又折腾了很久,发现如果采了之后立马发就是正常的,但是为了其他需求,在采集之后,会缓存一帧,问题就出在这个缓存一帧上。
手机麦克风的每次采集数据大小为370Byte的pcm数据,而蓝牙每次采集的数据大小为1024Byte(我猜测可能是为了不丢数据的原因),每次采集之后设置了回调的数据长度为640Byte。

  • 当第一次系统采集1024B时,回调出去640B,就会剩余384B,当第二次系统采集1024B时,就会瞬间回调出去两个640B的包,这是上层只缓存了一帧,就会丢掉1帧,这就导致了断断续续的产生。

文章来源于互联网,如有雷同请联系站长删除:记录蓝牙采集数据的坑

发表评论