RTP包的結構


live555中數據的發送最后是要使用RTP協議發送的,下面介紹一下RTP包格式。

RTP packet

RTP是基於UDP協議的,RTP服務器會通過UDP協議,通常每次會發送一個RTP packet。客戶端通過解析RTP packet,讀取其中的數據然后進行播放了。

RTP packet的結構如下:

  1. RTP Header:RTP 包的頭部
  2. contributing sources:個數為0-n個,所以可以為空。具體定義參考rfc3550
  3. RTP payload:即RTP要傳輸的數據

RTP Header

這是RTP流的頭部,在網上搜索RTP格式,就會搜到很多文章介紹這個頭部的定義。我們這里參考rfc3550的定義,在5.1節(http://tools.ietf.org/html/rfc3550#section-5.1)。

    0                   1                   2                   3
    0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
   |V=2|P|X|  CC   |M|     PT      |       sequence number         |
   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
   |                           timestamp                           |
   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
   |           synchronization source (SSRC) identifier            |
   +=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+
   |            contributing source (CSRC) identifiers             |
   |                             ....                              |
   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+

每行是32 bits,由此可以直觀看到每個表示部分所占的位數。簡單介紹一下:

V(version):2 bits,RTP的版本,這里統一為2

P(padding):1 bit,如果置1,在packet的末尾被填充,填充有時是方便一些針對固定長度的算法的封裝

X(extension):1 bit,如果置1,在RTP Header會跟着一個header extension

CC(CSRC count): 4 bits,表示頭部后contributing sources的個數

M(marker): 1 bit,具體這位的定義會在一個profile里

PT(playload type): 7 bits,表示所傳輸的多媒體的類型,對應的編號在另一份文檔rfc3551中有列出(http://tools.ietf.org/html/rfc3551)

sequence number: 16 bits,每個RTP packet的sequence number會自動加一,以便接收端檢測丟包情況

timestamp: 32 bits,時間戳

SSRC: 32 bits,同步源的id,沒兩個同步源的id不能相同

CSRC: 上文說到,個數由CC指定,范圍是0-15

RTP packet

RTP是基於UDP協議的,RTP服務器會通過UDP協議,通常每次會發送一個RTP packet。客戶端通過解析RTP packet,讀取其中的數據然后進行播放了。

RTP packet的結構如下:

  1. RTP Header:RTP 包的頭部
  2. contributing sources:個數為0-n個,所以可以為空。具體定義參考rfc3550
  3. RTP payload:即RTP要傳輸的數據

RTP Header

這是RTP流的頭部,在網上搜索RTP格式,就會搜到很多文章介紹這個頭部的定義。我們這里參考rfc3550的定義,在5.1節(http://tools.ietf.org/html/rfc3550#section-5.1)。

    0                   1                   2                   3
    0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
   |V=2|P|X|  CC   |M|     PT      |       sequence number         |
   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
   |                           timestamp                           |
   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
   |           synchronization source (SSRC) identifier            |
   +=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+
   |            contributing source (CSRC) identifiers             |
   |                             ....                              |
   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+

每行是32 bits,由此可以直觀看到每個表示部分所占的位數。簡單介紹一下:

V(version):2 bits,RTP的版本,這里統一為2

P(padding):1 bit,如果置1,在packet的末尾被填充,填充有時是方便一些針對固定長度的算法的封裝

X(extension):1 bit,如果置1,在RTP Header會跟着一個header extension

CC(CSRC count): 4 bits,表示頭部后contributing sources的個數

M(marker): 1 bit,具體這位的定義會在一個profile里

PT(playload type): 7 bits,表示所傳輸的多媒體的類型,對應的編號在另一份文檔rfc3551中有列出(http://tools.ietf.org/html/rfc3551)

sequence number: 16 bits,每個RTP packet的sequence number會自動加一,以便接收端檢測丟包情況

timestamp: 32 bits,時間戳

SSRC: 32 bits,同步源的id,沒兩個同步源的id不能相同

CSRC: 上文說到,個數由CC指定,范圍是0-15


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM