VLC對(duì)Live555 RTSP視頻直播穩(wěn)定性問(wèn)題
從不同時(shí)間測(cè)試來(lái)看,2015 VLC安卓版對(duì)rtsp兼容不太好,很不穩(wěn)定;2016年已經(jīng)穩(wěn)定下來(lái)了,但官網(wǎng)提供的android app還是存在直播時(shí)卡機(jī)問(wèn)題,開(kāi)發(fā)人員需要進(jìn)行提取去掉部分功能才能集成到自己的app中。
?若使用live555做為網(wǎng)絡(luò)直播流媒體服務(wù),當(dāng)網(wǎng)絡(luò)延遲造成播放速度快于流下載的速度,即doGetNextFrame函數(shù)調(diào)用時(shí)流還沒(méi)有傳輸過(guò)來(lái);此時(shí),用戶需要增加延遲N毫秒執(zhí)行任務(wù),不能直接return返回;否則公網(wǎng)/內(nèi)網(wǎng)播放是很容易中斷的(不是立即斷,所以是很多人長(zhǎng)時(shí)間糾結(jié)也不容易發(fā)現(xiàn)中斷的原因),同時(shí)也會(huì)造成崩潰情況。
?總的來(lái)說(shuō):當(dāng)doGetNextFrame沒(méi)流時(shí),不能直接return,一定要加延遲執(zhí)行 。也不能什么 都不處理,直接讓執(zhí)行到函數(shù)中末尾FramedSource::afterGetting(this)代碼(很容易崩潰);
下面列出關(guān)鍵延遲執(zhí)行代碼(來(lái)自網(wǎng)絡(luò)開(kāi)發(fā)人員啟發(fā)),定義延遲執(zhí)行回調(diào)函數(shù)
void?LiveStreamSource::GetNextFrame(void*?clientData) { LiveStreamSource*?obj=(LiveStreamSource*)clientData; if(obj!=NULL) { if?(!obj->isCurrentlyAwaitingData())?return; obj->doGetNextFrame(); ? } }
接著,在doGetNextFrame函數(shù)中視具體情況適當(dāng)位置增加
void?LiveStreamSource::doGetNextFrame()?{ //TODO?其他代碼 if(xxx) { delayTask=envir().taskScheduler().scheduleDelayedTask(30000,GetNextFrame,this);//沒(méi)數(shù)據(jù)延遲30毫秒 return; } //TODO?其他代碼 }