本项目是一个互联网音频广播得项目,其中APP推音频流到EasyDarwin服务器,云喇叭(音响,使用wifi联网)从EasyDarwin上拉流解码播放,但是在公司里测试时,老是出现播放卡顿的问题(公司网络不太稳定),前后大约耗时3个星期才从根本原因上解决问题。定位解决的过程大致如下:
一、一开始从源码去分析的,因为MP3一帧播放的时长大约是26.12毫秒,但是IOS得APP在填写RTP包的时间戳时舍去了0.12毫秒,直接填写26毫秒,也是起一个定时器,每隔26毫秒去推送一帧数据的,但是如果遇到网络情况不好的情况,那么不断每隔26毫秒去推送,那么会导致网络上的包越来越多,更加导致网络状况差,另一个方面,如果网络状态好时,因为这0.12毫秒的累积,最后也有可能导致拉流端的缓冲被填满的风险。于是做了第一次优化,优化方案就是使用了live555的taskschedule的机制,起了一个延时任务,在该任务里先记下上一帧推送RTP包后的系统时间戳(lastFrameTimestamp),然后记下推送当前帧的系统时间戳(currentTimeStamp),如果currentTimeStamp - lastFrameTimestamp的差值大于一帧数据的播放时长,则提前发送,提前的时间是delaySendTime = frameduration - (currentTimeStamp - g_lastFrameTimestamp - frameduration),同时把这个差值累积起来(deltaDelayTime),如果该差值达到了一帧数据的播放时长,则立马发送下一帧数据。整个的核心代码如下ÿ