最近做的sip對(duì)講項(xiàng)目橘霎,在接聽(tīng)時(shí)出現(xiàn)了視頻卡頓的問(wèn)題,為了排查這個(gè)問(wèn)題的原因殖属,首先想到的碼流本身是否有問(wèn)題還是傳輸?shù)紸PP之后解碼播放產(chǎn)生卡頓茎毁,所以第一反應(yīng)是將傳輸?shù)紸PP的碼流寫到本地,再用播放器進(jìn)行播放忱辅,看看碼流本身是否卡頓。
由于碼流的回調(diào)是在c++函數(shù)中谭溉,無(wú)法直接獲取到沙盒路徑墙懂,又不愿意為了調(diào)試改動(dòng)代碼,所以考慮采用條件斷點(diǎn)來(lái)導(dǎo)出碼流扮念。
1损搬、首先增加一段寫文件的代碼
static std::string path = "";
std::string ppp = "";
FILE* fd = fopen(path.c_str(), "a+");
if((long)fd <= 0)
{
printf("=============open failed=========\n");
}else {
fwrite(audioData, len, 1, fd);
fclose(fd);
}//導(dǎo)出數(shù)據(jù)
2、然后增加一個(gè)條件斷點(diǎn)
- 此時(shí)的沙盒路徑還未填寫完整
3柜与、在程序啟動(dòng)時(shí)巧勤,獲取沙盒路徑,并將條件斷點(diǎn)上的路徑填寫完整
3.1 在didFinishLaunchingWithOptions函數(shù)中做個(gè)斷點(diǎn)弄匕,并通過(guò)打印NSHomeDirectory()獲得沙盒路徑
3.2 將打印的路勁補(bǔ)充到斷點(diǎn)中
4颅悉、然后在接聽(tīng)呼入時(shí)進(jìn)行拉流,執(zhí)行斷點(diǎn)一次后迁匠,取消斷點(diǎn)剩瓶,就能將回調(diào)碼流寫入到本地
最后這個(gè)問(wèn)題定位的確是碼流本身有問(wèn)題驹溃,過(guò)來(lái)的碼流會(huì)卡頓,最后網(wǎng)絡(luò)組排查后是由于標(biāo)準(zhǔn)RTP沒(méi)有在幀頭附帶幀率信息延曙,網(wǎng)絡(luò)組會(huì)統(tǒng)計(jì)1S內(nèi)的幀數(shù)量豌鹤,計(jì)算幀率,如果1s內(nèi)統(tǒng)計(jì)的數(shù)量沒(méi)有達(dá)標(biāo)就會(huì)設(shè)置為默認(rèn)碼率枝缔,但他們也不知道為什么會(huì)導(dǎo)致他那邊誤判幀率為1導(dǎo)致卡頓布疙,最后他們通過(guò)設(shè)置默認(rèn)幀率為25解決了這個(gè)卡頓問(wèn)題。