一、发送频率:核心思想是根据音视频的时间戳进行发送频率控制。
1、在发送线程中,用最新获取到的帧时间戳 减去 上次发送帧的时间戳,得到音视频发送间隔,
2、计算当前系统时间跟上次发送系统时间 间隔是否已经大于等于 音视频发送间隔,
3、如果大于等于,直接发送,如果还没有达到音视频发送间隔,线程做相应时间的休眠后再发送,
4、如果音视频发送时间间隔大于视频帧间间隔(可以根据视频帧率计算),应该认为前端是有丢帧,跳帧,应该直接发送。
5、如果得到的音视频发送间隔是负数,应该认为前端送帧发生了帧乱序,此时不应该按照该帧的时间戳进行发送。
二、帧乱序处理:小范围排序,缓冲调整,丢弃,恢复,重传
1 直接丢弃该帧!这会产生一个严重后果就是接收端会发生花屏,卡顿的现象。
1 修复该帧时间戳!根据音视频帧率,和上次帧的时间戳进行修复,也就是重新给该帧填充时间戳。
此时如果该帧不是上一帧的连续帧,接收端会出现跳帧现象,甚至花屏,卡顿。
3 在前端做少量帧排序,尽量保证前端送帧有序。这种音视频帧乱序,如果音频和视频编码器是两个线程,
考虑到不同线程出帧速度的快慢,有可能会影响编码后的帧到达先后顺序。
4 如果是网络传输到达的帧乱序,处理比较麻烦。
4.1 需要做一定的缓冲,在缓冲中调整帧顺序,再出帧。
4.2 在网络情况不是特别差的情况下,发送非连续丢帧,可以增加FEC的机制,进行丢包恢复。
(FEC需要增加冗余包发送,在发送和接收端都需要复杂的计算,比较消耗CPU等计算资源)
4.3 增加确认和重传机制,确认机制在流程上变得复杂,重传会进一步消耗带宽,如果在网络带宽不好的情况下,需要做好平衡。