RTMP詳細分析(三次握手)
RTMP詳細分析(Message 消息,Chunk分塊)
librtmp分析(接收數據包處理)
rtmp協議中的message的發送涉及有message 分chunk、base header長度的變化、message header長度的變化,只查看文檔比較難理解,分析一下librtmp庫中的int RTMP_SendPacket(RTMP *r, RTMPPacket *packet, int queue)函數可以更好的理解。
目錄
- 注意:Packet 內部分配的注意事項
- 1、申請用于保存上一次發送的packet的信息的空間。
- 2、根據判斷message header的長度的標識m_headerType,再和上一次Packet的數據類型、數據長度、時間戳判斷是否可以再減少message header的長度。
- 3、根據message header的長度標識m_headerType獲取message header的長度,這時base header長度還是默認1個字節的。和計算與上一個Packet的相對時間戳。
- 4、獲取消息頭和消息體的位置。
- 5、根據csid的值再增加base header的長度和是否要擴展時間戳再增加擴展時間戳空間。
- 6、設置base header部分數據到發送的數據空間中。
- 7、根據message header的長度設置相應的字段和設置擴展時間戳。
- 8、循環發送數據。
- 9、遠程調用函數命令的額外處理。
- 10、保存這次Packet信息,用于下次判斷。
注意:Packet 內部分配的注意事項
Packet內部內存分配是一次按最大的頭部長度來分配的,再將數據指針m_body指向數據的位置,所以后續就可以動態調整頭部的大小,而沒有重復分配內存。
1、申請用于保存上一次發送的packet的信息的空間。
2、根據判斷message header的長度的標識m_headerType,再和上一次Packet的數據類型、數據長度、時間戳判斷是否可以再減少message header的長度。
3、根據message header的長度標識m_headerType獲取message header的長度,這時base header長度還是默認1個字節的。和計算與上一個Packet的相對時間戳。
4、獲取消息頭和消息體的位置。
5、根據csid的值再增加base header的長度和是否要擴展時間戳再增加擴展時間戳空間。
6、設置base header部分數據到發送的數據空間中。
7、根據message header的長度設置相應的字段和設置擴展時間戳。
8、循環發送數據。