一、發送頻率:核心思想是根據音視訊的時間戳進行發送頻率控制。
1、在發送線程中,用最新擷取到的幀時間戳 減去 上次發送幀的時間戳,得到音視訊發送間隔,
2、計算目前系統時間跟上次發送系統時間 間隔是否已經大于等于 音視訊發送間隔,
3、如果大于等于,直接發送,如果還沒有達到音視訊發送間隔,線程做相應時間的休眠後再發送,
4、如果音視訊發送時間間隔大于視訊幀間間隔(可以根據視訊幀率計算),應該認為前端是有丢幀,跳幀,應該直接發送。
5、如果得到的音視訊發送間隔是負數,應該認為前端送幀發生了幀亂序,此時不應該按照該幀的時間戳進行發送。
二、幀亂序處理:小範圍排序,緩沖調整,丢棄,恢複,重傳
1 直接丢棄該幀!這會産生一個嚴重後果就是接收端會發生花屏,卡頓的現象。
1 修複該幀時間戳!根據音視訊幀率,和上次幀的時間戳進行修複,也就是重新給該幀填充時間戳。
此時如果該幀不是上一幀的連續幀,接收端會出現跳幀現象,甚至花屏,卡頓。
3 在前端做少量幀排序,盡量保證前端送幀有序。這種音視訊幀亂序,如果音頻和視訊編碼器是兩個線程,
考慮到不同線程出幀速度的快慢,有可能會影響編碼後的幀到達先後順序。
4 如果是網絡傳輸到達的幀亂序,處理比較麻煩。
4.1 需要做一定的緩沖,在緩沖中調整幀順序,再出幀。
4.2 在網絡情況不是特别差的情況下,發送非連續丢幀,可以增加FEC的機制,進行丢包恢複。
(FEC需要增加備援包發送,在發送和接收端都需要複雜的計算,比較消耗CPU等計算資源)
4.3 增加确認和重傳機制,确認機制在流程上變得複雜,重傳會進一步消耗帶寬,如果在網絡帶寬不好的情況下,需要做好平衡。