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