基於TCP的RTSP/RTP流媒體傳輸
阿新 • • 發佈:2019-02-06
為什麼用TCP來傳輸
- UDP協議上的RTSP/RTP需要開啟許多UDP埠,一個埠用於RTSP通訊,n個埠用於RTP,n個埠用於RTCP
- 中間網路路由器很容易就過濾或者忽略掉UDP資料包
- UDP是不可靠傳輸協議,媒體包在因特網上傳輸時會面臨著丟包
流媒體推流流程
option -> Announce -> Setup -> Record
流媒體拉流流程
option -> Describe -> Setup -> Play
RTP包頭差異
rtp基於tcp的包頭比基於udp的包頭多了4個位元組:
* magic固定為0x24,
* channel用來區分音視訊等多路流媒體的通道,其中偶數通道為流媒體內容,奇數通道為RTCP
* len表示資料包的長度減去開始的4個位元組,即len欄位之後的資料長度
tcp | udp |
---|---|
U8 magic | |
U8 channel | |
U16 len | |
U8 csrc_len:4 | U8 csrc_len:4 |
U8 extension:1 | U8 extension:1 |
U8 padding:1 | U8 padding:1 |
U8 version:2 | U8 version:2 |
U8 payload:7 | U8 payload:7 |
U8 marker:1 | U8 marker:1 |
U16 seq_no | U16 seq_no |
U32 timestamp | U32 timestamp |
U32 ssrc | U32 ssrc |
推流注意點
因為所有的流媒體通過同一個埠傳送,必須保證每一個數據包傳送完成。如果音視訊採用不同的程序傳送,由於send不一定能保證一次性把資料傳送完,可能會出現音訊資料發一部分,後面跟著視訊的一部分資料,會導致另一端解析資料出錯。因此需要採用一些同步機制,保證音視訊傳送資料的完整。