medooze源碼分析–SDP

前言

SDP(Session Description Protocol) 的目的是在媒體會話中傳遞媒體信息。SDP在很多地方使用,WebRTC也會使用它做媒體信息交換。

下面我們就來詳細描述一下SDP。

SDP的內容

SDP主要包括以下信息:

  • 會話的名稱與目的
  • 會話的存活時間
  • 會話中的媒體信息,這是最主要的,它又包括以下內容:
    • 媒體類型
    • 媒體格式
    • 傳輸協議
    • 傳輸的IP和端口

SDP的格式

SDP是由多個<type>=<value>組成的。其中<type>是一個字符, <value>是一個字符串。需要特別注意的是,=兩邊是不能有空格的。

SDP會話描述由一個會話級描述(session_level description)和多個媒體級描述(media_level description)組成。

會話級(session_level)的作用域是整個會話。其位置是從』v=』行開始到第一個媒體描述為止。

媒體級(media_level)描述是對單個的媒體流進行描述,其位置是從』m=』行開始到下一個媒體描述為止。

總之,除非媒體部分重載,會話級的值是各個媒體的缺省默認值。

SDP的結構

Session description

  • v= (protocol version)
  • o= (owner/creator and session identifier).
  • s= (session name)
  • i=* (session information)
  • u=* (URI of description)
  • e=* (email address)
  • p=* (phone number)
  • c=* (connection information – not required if included in all media)
  • b=* (bandwidth information)
  • z=* (time zone adjustments)
  • k=* (encryption key)
  • a=* (zero or more session attribute lines)

Time description

  • t= (time the session is active)
  • r=* (zero or more repeat times)

Media description

  • m= (media name and transport address)
  • i=* (media title)
  • c=* (connection information – optional if included at session-level)
  • b=* (bandwidth information)
  • k=* (encryption key)
  • a=* (zero or more media attribute lines)

類型字段含義

Version(必選)

v=0 SDP的版本號,不包括次版本號。

origion(必選)

o=<username> <session id> <version> <network type> <address type> <address>

  • 「o=」項對會話的發起者進行了描述。
  • <username>是用戶的登錄名。如果主機不支持<username>,則為 」-」 。 注意:<username>不能含空格。
  • <session id>:是一個數字串。在整個會話中,必須是唯一的。為了確保其唯一,建議使用NTP(Network Time Protocol) timestamp。
  • <version>:該會話公告的版本,供公告代理服務器檢測同一會話的若干個公告中哪個是最新公告。基本要求是會話數據修改後該版本值遞增,建議用NTP時戳。
  • <network type>:網絡類型,一般為」IN」,表示」internet」
  • <address type>:地址類型,一般為IP4
  • <address>:地址

Session Name(必選)

s=<session name> 會話名,在整個會話中有且只有一個」s=」。

Connection Data(可選)

c=<network type> <address type> <connection address>

表示媒體連接信息。 一個會話聲明中,會話級描述中必須有」c=」項或者在每個媒體級描述中有一個」c=」項。

可能在會話級描述和每個媒體級描述中都有」c=」項。

  • <network type>:網絡類型,一般為」IN」,表示」internet」
  • <address type>:地址類型,一般為IP4。
  • <connection address>:應用程序必須處理域名和ip地址兩種情形。
    • 單播時,為域名或ip地址,推薦使用域名;
    • 多播時,為ip地址,且ip後面必須有TTL(取值範圍是0-255)。地址和TTL決定了多播包被傳播的範圍,例: c=IN IP4 224.2.1.1/127。分層編碼方案是一個數據流被分為多層,接受者能夠通過申請不同層的流選擇流的質量。如下:<base multicast address>/<ttl>/<number of addresses> 如果<number of addresses>沒有給定,則默認為1。 c=IN IP4 224.2.1.1/127/3 等價於: c=IN IP4 224.2.1.1/127 c=IN IP4 224.2.1.2/127 c=IN IP4 224.2.1.3/127

Bandwidth(可選)

b=<modifier>:<bandwidth-value>

描述了建議的帶寬,單位kilobits per second,可選。

  • <modifier>:包括兩種CT和AS。CT:Conference Total,總帶寬。AS:Application-Specific Maximum,單個媒體帶寬的最大值。 擴展機制:<modifier>以」X-」開始。建議modifier越短越好。例 b=X-YZ:128

Times(必選)

t=<start time> <stop time>

描述了會話的開始時間和結束時間。 <start time> 和<stop time> 為NTP時間,單位是秒。假如<stop time>為零表示過了<start time>時間後會話一直持續。當<start time> 和<stop time>均為零時表示持久會話。

建議start time和stop time不要設為0。因為不知道此會話的開始和結束時間,增加了調度(scheduling)的難度。

Media Announcements (必選)

m=<media> <port> <transport> <fmt list>

一個會話描述包括幾個媒體描述。一個媒體描述以」m=」開始到下一個」m=」結束。

  • <media>:表示媒體類型。有"audio", "video", "application"(例白板信息), "data"(不向用戶顯示的數據) 和"control"(描述額外的控制通道)。
  • <port>:媒體流發往傳輸層的端口。取決於c=行規定的網絡類型和接下來的傳送層協議:對UDP為1024-65535;對於RTP為偶數。 當分層編碼流被發送到一個單播地址時,需要列出多個端口。方式如下: m=<media> <port>/<number of ports> <transport> <fmt list> 對於RTP,偶數端口被用來傳輸數據,奇數端口用來傳輸RTCP包。例: m=video 49170/2 RTP/AVP 31 端口49170和49171為第一對RTP/RTCP端口,49172和49173為第二對的端口。傳輸協議是RTP/AVP,媒體格式為31。
  • <transport>:傳輸協議,與c=行的地址類型有關。兩種: RTP/AVP,表示Realtime Transport Protocol using the Audio/Video profile carried over UDP;UDP。
  • <fmt list>:媒體格式。對於音頻和視頻就是在RTP Audio/Video Profile定義的負載類型(payload type)。但第一個為缺省值,分為靜態綁定和動態綁定:靜態綁定即媒體編碼方式與RTP負載類型有確定的一一對應關係,動態綁定即媒體編碼方式(如時鐘頻率,音頻信道數等)沒有完全確定,需要進一步的屬性說明(用rtpmap)。 分別舉例如下: 靜態綁定的例子:u_law的PCM編碼單信道Audio,採樣率8KHZ。在RTP Audio/Video profile中對應的payload type為0。即: m=audio 49232 RTP/AVP 0 動態綁定的例子:16位線形編碼,採樣率為16KHZ,假如我們希望動態RTP/AVP 類型98表示此此流,寫法如下: m=video 49232 RTP/AVP 98 a=rtpmap:98 L16/16000/2

rtpmap(可選)

a=rtpmap:<payload type> <encoding name>/<clock rate>[/<encodingparameters>]

a=rtpmap:<負載類型><編碼名>/<時鐘速率>[/<編碼參數>]

  • 對於音頻流,<編碼參數>說明了音頻的通道數。通道數默認缺省值為1。
  • 對於視頻流,現階段沒有<編碼參數>。

m=audio 49230 RTP/AVP 96 97 98 a=rtpmap:96 L8/8000 a=rtpmap:97 L16/8000 a=rtpmap:98 L16/11025/2

在rtpmap中,實驗性的編碼方案也可以用。其格式名前一定為」X-」例:一種新的實驗性的被稱為GSMLPC的音頻流,使用的動態負載類型為99。 m=video 49232 RTP/AVP 99 a=rtpmap:99 X-GSMLPC/8000 9.Suggested Attributes(可選) a=<TYPE>或 a=<TYPE>:<VALUES> a=framerate:<幀速率>//單位:幀/秒 a=lang:<語言標記>//會話描述的缺省語言或媒體描述的語言

註: 如果SDP語法分析器不能識別某一類型(Type),則整個描述丟失。 如果」a=」的某屬性值不理解,則予以丟失此屬性。 會話級的描述就是媒體級描述的。