在sip項目中肤舞,快發(fā)布的時候出現(xiàn)了一個奇葩問題:直接進行麥克風采集通過網(wǎng)絡(luò)在設(shè)備上播放時图仓,音頻正常。但是如果手機連接了藍牙揭厚,通過藍牙采集再在設(shè)備上進行播放時却特,音頻卻是斷斷續(xù)續(xù)的,和我上一篇文章一樣筛圆,首先我這邊想要確定的是發(fā)送之前的問題還是發(fā)送之后的問題裂明。
1、如果是發(fā)送之前的問題太援,那么很有可能就是采集有問題闽晦,所以我在采集回調(diào)里將音頻數(shù)據(jù)寫到本地,由于是PCM數(shù)據(jù)提岔,所以這邊寫到本地后仙蛉,用cooleditPro聽了之后,發(fā)現(xiàn)數(shù)據(jù)是好的碱蒙,并沒有設(shè)備斷斷續(xù)續(xù)的現(xiàn)象荠瘪。
從波形看也是正常的,說明采集是正常的赛惩,數(shù)據(jù)完整哀墓,那就有可能是網(wǎng)絡(luò)組建在組包時出了問題,所以又轉(zhuǎn)去抓包
2喷兼、抓包篮绰,看發(fā)出去的數(shù)據(jù)是否正常,這邊又有一個Wireshark的坑季惯,下篇文章簡單介紹一下吠各,從抓包看臀突,發(fā)出去的數(shù)據(jù)的確是有問題。
很明顯的數(shù)據(jù)斷斷續(xù)續(xù)贾漏,所以我又特地抓了正常數(shù)據(jù)的包進行對比惧辈。
Wireshark坑:直接使用Wireshark抓取手機包時,由于發(fā)送在ms級別磕瓷,導致抓包的時間戳不準確盒齿,計算兩次數(shù)據(jù)發(fā)送的間隔會有誤差,大的有1000ms左右困食,所以建議以后使用tcpdump抓包
sudo tcpdump -i rvi0 -s 0 -w ./Desktop/xxx.pcap
所以這個問題比較就只能出在采集之后边翁,發(fā)出去之前。反正又折騰了很久硕盹,發(fā)現(xiàn)如果采了之后立馬發(fā)就是正常的符匾,但是為了其他需求,在采集之后瘩例,會緩存一幀啊胶,問題就出在這個緩存一幀上。
手機麥克風的每次采集數(shù)據(jù)大小為370Byte的pcm數(shù)據(jù)垛贤,而藍牙每次采集的數(shù)據(jù)大小為1024Byte(我猜測可能是為了不丟數(shù)據(jù)的原因),每次采集之后設(shè)置了回調(diào)的數(shù)據(jù)長度為640Byte焰坪。
- 當?shù)谝淮蜗到y(tǒng)采集1024B時,回調(diào)出去640B聘惦,就會剩余384B某饰,當?shù)诙蜗到y(tǒng)采集1024B時,就會瞬間回調(diào)出去兩個640B的包善绎,這是上層只緩存了一幀黔漂,就會丟掉1幀,這就導致了斷斷續(xù)續(xù)的產(chǎn)生禀酱。