之前有一個(gè)實(shí)習(xí)生問(wèn)我,說(shuō)他做了一個(gè)語(yǔ)音通話(huà)的功能滑负,但是為什么傳過(guò)來(lái)的聲音幾乎不能聽(tīng)。為什么會(huì)這樣呢用含?如果用的是tcp傳輸應(yīng)該是不會(huì)丟的矮慕,但是如果是UDP傳輸?shù)脑?huà),那么丟的概率就比較大了啄骇。丟包只是一方面大原因痴鳄,其實(shí)還有另一個(gè)原因那就是由于網(wǎng)絡(luò)的延遲,擁堵而導(dǎo)致的播放亂序缸夹。大家知道網(wǎng)絡(luò)的傳輸是無(wú)序的痪寻,那么很有可能一包數(shù)據(jù)到達(dá)的很晚螺句,一包會(huì)較早的到達(dá)。所以對(duì)于網(wǎng)絡(luò)傳輸語(yǔ)音需要一個(gè)抖動(dòng)緩沖區(qū)對(duì)網(wǎng)絡(luò)發(fā)送語(yǔ)音進(jìn)行一定的策略才能再轉(zhuǎn)給上層播放橡类。那抖動(dòng)緩沖區(qū)的原理是什么呢蛇尚?
抖動(dòng)緩沖區(qū)就是將接收到的語(yǔ)音先存到一個(gè)buffer里面,根據(jù)當(dāng)前網(wǎng)絡(luò)的延遲時(shí)間以及當(dāng)前上層獲取的時(shí)間對(duì)數(shù)據(jù)進(jìn)行選取顾画。使用抖動(dòng)緩沖是以延遲為代價(jià)的取劫,從而保證語(yǔ)音的流暢。首先會(huì)計(jì)算當(dāng)前網(wǎng)絡(luò)的延遲研侣,可以根據(jù)網(wǎng)絡(luò)延遲的大小設(shè)定變化的buffer的大小谱邪,但是buffer也可以是不變的,這要看怎么設(shè)計(jì)了庶诡。當(dāng)上層來(lái)取數(shù)據(jù)的時(shí)候根據(jù)當(dāng)前網(wǎng)絡(luò)的延遲時(shí)間取當(dāng)前時(shí)間減去網(wǎng)絡(luò)延遲時(shí)間的數(shù)據(jù)包惦银,這個(gè)時(shí)間并不一定這樣嚴(yán)格,可以有一定的幅度灌砖。比較有名的開(kāi)源項(xiàng)目:doubango璧函,webrtc都實(shí)現(xiàn)了這樣的功能傀蚌。