28181中RTP包封裝解讀
程式將採集到的H.264碼流進行封裝,元碼流存放在U08 *pData中,remain為原始碼流未傳送的資料長度,sendlen為原始碼流已傳送的資料長度,datelen為本次要傳送的包體長度,packlen為包長度(不包括包頭、包尾)。
打包過程為先根據幀型別判斷是I幀還是P幀。
- I幀的第一包
將H264碼流中的包頭分解出來(header+sps+pps+sei+data),然後存放到相應陣列中。這時remain-=sendlen(以上包頭長度)為剩餘要傳送的資料
根據RTP的打包格式(RTP+ PS header +PS system header + PS system Map + [PES header +sps] + [PES header +pps] + [PES header +sei] + PES header +h264 raw data
在h264 raw data之前的長度都累加到datelen上,由於網路傳輸過程中MTU一般為1500位元組,所以h264 raw data的長度這裡設定為1460,本程式中減去了一個結構體的長度,最後為h264 raw data=1460-23-2=1435(我也不知道為什麼)。
將原始碼流偏移sendlen後的資料拷貝h264 raw data大小給傳送結構體傳送出去。並且remain-=datalen(剩餘),sendlen+=datalen(已發),將I幀第一包標誌置位0,進入while傳送剩餘幀直到remain>0不成立。
第一包 第二包
剩餘資料打包格式為(RTP+ h264 raw data)
先判斷if (remain > (maxBodyLen-RTP_HDR_LEN)),決定是不是最後一包,然後打包傳送並且remain-=datalen(剩餘),sendlen+=datalen(已發)
- P幀
打包格式(RTP+ PS header+ PES header +h264 raw data),如果一包發不完,步驟跟I幀相同。