live555中數據的發送最后是要使用RTP協議發送的,下面介紹一下RTP包格式。
RTP packet
RTP是基於UDP協議的,RTP服務器會通過UDP協議,通常每次會發送一個RTP packet。客戶端通過解析RTP packet,讀取其中的數據然后進行播放了。
RTP packet的結構如下:
- RTP Header:RTP 包的頭部
- contributing sources:個數為0-n個,所以可以為空。具體定義參考rfc3550
- 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的結構如下:
- RTP Header:RTP 包的頭部
- contributing sources:個數為0-n個,所以可以為空。具體定義參考rfc3550
- 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