使用live555搭建rtsp服务器推送实时流时总是出现花屏,查阅资料按照大多数人所说的修改做了以下几项修改:
1、修改OutPacketBuffer::maxSize=1024*1024 ;
2、扩展帧解析buffer大小,即BANK_SIZE=1024*1024;
改完之后没什么用,该花还是花,深究之后发现花屏原因是我是通过读文件模拟推送实时流,原264文件是30帧,我是按照50帧推送,所以doGetNextFrame的取帧速度保持在33ms调用一次,这显然会造成严重的丢帧问题。于是我尝试各种修改比如设置fDurationInMicroseconds=1000000/50,还是没什么用。于是我又修改H264or5VideoStreamFramer.cpp的fFrameRate强制改为100,发现一开始取帧速度差不多10ms取帧一次,但是一旦取到IDR帧后又变为按照30fps取帧,所以明白live555会解析sps的帧率,于是将H264or5VideoStreamFramer.cpp里的fFrameRate = fParsedFrameRate的地方都改成100;这样就差不多10ms调用一次doGetNextFrame了,100帧对于大部分环境都是够用了,遇到超高帧的情况再修改。
然后又在doGetNextFrame里做了修改,如果取不到帧就一直等待,取到帧之后再调用afterGetting(this);
live555原来的rtsp服务器逻辑基于读文件推送,所以解析文件头获取帧率以固定帧率取帧推送。可是实时流不确定状况很多,实时源可能无法保证视频帧稳定输出,而且有的编码器可能会pps,sps的帧率和实际帧率不符。所以感觉这样修改还是有必要的。等上实际环境验证下试试rtsp服务器的稳定性和健壮性。
当然对于视频源输出稳定的情况,按照原来的live555架构即可。
放弃live555了,使用ZlMediaKit CAPI 推流服务器简单又高效。