第三季2:ORTP库的源码分析、RTP发送实验的源码分析
以下內容源于朱有鵬課程,如有侵權,請告知刪除。
一、ORTP庫源碼分析
1、ORTP庫概覽
(1)庫提供一堆功能函數(本身沒有main),都在src目錄下
(2)庫的使用給了案例(有main),在src/tests目錄下
(3)相關數據結構和頭文件,在include/ortp目錄下
(4)ortp實現了rtp和rtcp協議,前者負責傳輸,后者負責控制和同步協調
2、ORTP庫的使用案例分析
src/tests/rtpsend.c的函數調用關系
- ortp_init
- ? ? ? ? ?av_profile_init(&av_profile)初始化全局變量av_profile(該變量記錄了可以識別哪些profile,如果你要用哪部分,要添加進來。有的本來已經添加,有的沒有但你要用的話,要自己添加。這也是為什么“第三季1二2”中為何要添加那行代碼的原因)。
- ortp_scheduler_init? ? ORTP調度器:即仲裁機構(一段代碼),功能是在一個任務中完成多個會話的發送和接收,類似于select。
- ? ? ? ? ?rtp_session_new? 會話創建
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實現通長是動態調整緩存大小的,在網絡延遲大,抖動嚴重時會動態增加緩存大小,在網絡恢復時動態減小緩存大小以減少端到端的播放延遲。
二、RTP發送實驗的源碼分析
注意:
1、這里的RTP發送實驗的源碼,是指修改后兩個文件
mpp/sample/venc/sample_venc.c
common/sample_common_venc.c。
修改的內容以及源文件見“第三季1:ORTP庫的移植與局域網視頻傳輸”中的第三內容。
2、回憶起之前學過的關sample_venc.c文件,其中函數SAMPLE_VENC_1080P_CLASSIC有7個步驟。RTP發送實驗與之前學的,相同點在于前五個步驟是一樣的,不同點在于之前的sample_venc.c在第六步驟將數據一包一包地寫到文件里,而RTP發送實驗是將數據一包一包地發送出去。
1)第六步的代碼如下。
RTP發送實驗源碼的具體的改動,在SAMPLE_COMM_VENC_GetVencStreamProc函數以及它所調用的函數中:
1)SAMPLE_COMM_VENC_GetVencStreamProc函數代碼
?2)SAMPLE_COMM_VENC_SaveStream函數,以及調用的函數。
1、ortp庫相應API
- 通過分析追蹤RTP發送源碼的第六步驟的SAMPLE_COMM_VENC_GetVencStreamProc函數中的rtpInit函數,發現其和src/tests/rtpsend.c中main函數部分代碼很類似。
2、發送函數的重點講解
即rtpSend函數,在修改后的common/sample_common_venc.c中。
3、可能的拓展方向
(1)裁剪sample到最簡化
(2)修改一些參數做實驗(譬如每包字節數、IP地址、端口號等)
4、VLC的sdp文件格式
總結
以上是生活随笔為你收集整理的第三季2:ORTP库的源码分析、RTP发送实验的源码分析的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: java实现数据库回滚,java 数据库
- 下一篇: java迭代器逆序_迭代器