ORTP源碼分析

1、ORTP庫概覽
(1)庫本身沒有main,提供一堆功能函數,都在src目錄下
(2)庫的使用給了案例,有main,在src/tests目錄下
(3)相關數據結構和頭文件在include/ortp目錄下
(4)ortp實現了rtp和rtcp協議,前者負責傳輸,後者負責控制和同步協調

2、ORTP庫的使用案例
下面分析主要對  src/tests/rtpsend.c  進行分析

3、rtp的session
(1)rtp通過會話來管理數據發送和接收,會話的本質是一個結構體,管理很多信息
(2)創建會話用rtp_session_new
(3)rtp發送用rtp_session_send_with_ts
(4)底層真正幹活的還是socket接口那一套,參考rtpsession_inet.c

4、ORTP的一些小細節
(1)port.c中對OS的常用機制(任務創建和銷燬、進程管理和信號量等)進行了封裝,便於將ortp移植到不同平臺中
(2)utils.c中實現了一個雙向鏈表
(3)str_util.c中實現了一個隊列管理
(4)rtpparse.c和rtcpparse.c文件實現瞭解析收到的rtp數據包的部分
(5)jitterctl.c中實現了jitter buffer來防抖。jitter buffer技術是ip 音視頻通信裏相對比較高級的主題,jitter buffer模塊好壞通常是衡量一個voip客戶端/服務器好壞的技術點之一,尤其是在網絡抖動比較嚴重,如3g, wifi環境,數據包的rtt值不均衡往往會導致語音卡頓,丟字等現象,jitter buffer 模塊通過緩存一段數據包,把數據包重排,並均勻的送給播放端,一個好的jitter buffer實現通長是動態調整緩存大小的,在網絡延遲大,抖動嚴重時會動態增加緩存大小,在網絡恢復時動態減小緩存大小以減少端到端的播放延遲。

5.Jitter buffer
如果網絡是理想的,即無丟包、無抖動、低延時,那麼接收到一幀完整數據就直接播放,效果一定會非常好。但是實際的網絡往往很複雜,尤其是無線網絡。如果還是這樣直接播放,網絡稍微變差,視頻就會卡頓,出現馬賽克等異常情況。所以,在接收端對接收的數據做一個緩衝是很有必要的。
緩衝一定是以延時作爲代價的,延時越大,對抖動的過濾效果越好。一個優秀的視頻jitterbuffer,不僅要能夠對丟包、亂序、延時到達等異常情況進行處理,而且還要能夠讓視頻平穩的播放,儘可能的避免出現明顯的加速播放和緩慢播放。
主流的實時音視頻框架基本都會實現jitterbuffer功能,諸如WebRTC、doubango等。WebRTC的jitterbuffer相當優秀,按照功能分類的話,可以分爲jitter和buffer。buffer主要對丟包、亂序、延時到達等異常情況進行處理,還會和NACK、FEC、FIR等QOS相互配合。jitter主要根據當前幀的大小和延時評估出jitter delay,再結合decode delay、render delay以及音視頻同步延時,得到render time,來控制平穩的渲染視頻幀。
下面將分別對jitter和buffer做介紹。

 

https://blog.csdn.net/bjrxyz/article/details/56494535

https://blog.csdn.net/wangdapao12138/article/details/82535113

https://blog.csdn.net/jsn_ze/article/details/50780425

 

 

 

 

 

 

 

 

 

 

 

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章