1. 程式人生 > >基於TCP的RTSP/RTP流媒體傳輸

基於TCP的RTSP/RTP流媒體傳輸

為什麼用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不一定能保證一次性把資料傳送完,可能會出現音訊資料發一部分,後面跟著視訊的一部分資料,會導致另一端解析資料出錯。因此需要採用一些同步機制,保證音視訊傳送資料的完整。