最近在看 jrtplib的收包流程,看了這篇文章 jrtplib接收資料報流程 ,只是用的庫老了點 v3.7 的,寫的也太長了,不夠簡練,於是自己寫乙份
v3.11.1的簡練點的收包流程說明,撿重點,無關的流程略過。
rtp包的接收入口函式
int rtpsession::poll()
————————————— 流程(一) 的剖析 ————————————–
說明: rtptrans是rtpsession類的成員變數,預設是rtpudpv4transmitter類,它實現了rtp包以及rtcp包的收發工作
步驟1,分別從 rtpsock 和 rtcpsock 收資料
int rtpudpv4transmitter::poll()
}步驟2
int rtpudpv4transmitter::pollsocket(bool rtp)
————————————— 流程(二) 的剖析 ————————————–
步驟1int rtpsession::processpolleddata()
// 下面是傳送rtcp相關的,沒研究過
status = rtcpbuilder.buildnextpacket(&pack)
status=rtptrans->sendrtcpdata(pack->getcompoundpacketdata(),pack->getcompoundpacketlength()) //傳送rtcp包
}步驟2,內部解析元資料,判斷是rtp還是rtcp包,然後分別處理
int rtpsources::processrawpacket(rtprawpacket *rawpack )
// 步驟2.2.3, 內部迴圈處理csrc陣列,沒研究過
for (i = 0 ; i < num ; i++)
}ok,到此rtpsession收rtp包後存入佇列,收包流程就結束了,接下來就是處理這些收到的包了,官方示例如下:
sess.begindataaccess(); //同步鎖
// check incoming packets
// 開始遍歷參與者中第乙個有rtp資料的流,如果找到了,就返回tree,否則返回false。
//在接收資料時我們常用的是這套函式,因為如果沒有資料要來都沒用
if (sess.gotofirstsourcewithdata())
;memcpy(pbuffer,pack->getpayloaddata(),pack->getpayloadlength());
printf("got packet -->%s \n",pbuffer); // 介面列印收到的字串
// we don't longer need the packet, so
// we'll delete it
sess.deletepacket(pack);
}} while (sess.gotonextsourcewithdata());
}sess.enddataaccess();
3 11隨機選擇
問題 你想從乙個序列中隨機抽取若干元素,或者想生成幾個隨機數。解決方案 random模組有大量的函式用來生產隨機數和隨機選擇元素。比如,想要從乙個序列中隨機的抽取乙個元素,可以使用random.choice import random values 1,2,3,4,5,6 print random....
完全揹包 311
時間限制 3000 ms 記憶體限制 65535 kb 難度 4 描述直接說題意,完全揹包定義有n種物品和乙個容量為v的揹包,每種物品都有無限件可用。第i種物品的體積是c,價值是w。求解將哪些物品裝入揹包可使這些物品的體積總和不超過揹包容量,且價值總和最大。本題要求是揹包恰好裝滿揹包時,求出最大價值...
實驗3 11 計算油費
實驗3 11 計算油費 15分 現在90號汽油6.95元 公升 93號汽油7.44元 公升 97號汽油7.93元 公升。為吸引顧客,某自動加油站推出了 自助服務 和 協助服務 兩個服務等級,分別可得到5 和3 的折扣。本題要求編寫程式,根據輸入顧客的加油量a,汽油品種b 90 93或97 和服務型別...