从不同时间测试来看,2015 VLC安卓版对rtsp兼容不太好,很不稳定;2016年已经稳定下来了,但官网提供的android app还是存在直播时卡机问题,开发人员需要进行提取去掉部分功能才能集成到自己的app中。
若使用live555做为网络直播流媒体服务,当网络延迟造成播放速度快于流下载的速度,即doGetNextFrame函数调用时流还没有传输过来;此时,用户需要增加延迟N毫秒执行任务,不能直接return返回;否则公网/内网播放是很容易中断的(不是立即断,所以是很多人长时间纠结也不容易发现中断的原因),同时也会造成崩溃情况。
总的来说:当doGetNextFrame没流时,不能直接return,一定要加延迟执行 。也不能什么 都不处理,直接让执行到函数中末尾FramedSource::afterGetting(this)代码(很容易崩溃);
下面列出关键延迟执行代码(来自网络开发人员启发),定义延迟执行回调函数
void LiveStreamSource::GetNextFrame(void* clientData)
{
LiveStreamSource* obj=(LiveStreamSource*)clientData;
if(obj!=NULL)
{
if (!obj->isCurrentlyAwaitingData()) return;
obj->doGetNextFrame();
}
}
接着,在doGetNextFrame函数中视具体情况适当位置增加
void LiveStreamSource::doGetNextFrame() {
//TODO 其他代码
if(xxx)
{
delayTask=envir().taskScheduler().scheduleDelayedTask(30000,GetNextFrame,this);//没数据延迟30毫秒
return;
}
//TODO 其他代码
}