sdp 詳解

SDP目的就是在媒體會話中,傳遞媒體流信息,允許會話描述的接收者去參與會話。SDP基本上在internet上工作。他定義了會話描述的統一格式,但並不定義多播地址的分配和SDP消息的傳輸,也不支持媒體編碼方案的協商,這些功能均由下層傳送協議完成。典型的會話傳送協議包括:SAP(Session Announcement Protocol會話公告協議),SIP(Session Initiation Protocol,會話初始協議),RTSP,HTTP,和使用MIME的E-Mail。

 

SDP包括以下一些方面:

(1)會話的名稱和目的

(2)會話存活時間

(3)包含在會話中的媒體信息,包括:

媒體類型(video,audio, etc)

傳輸協議(RTP/UDP/IP,H.320, etc)

媒體格式(H.261video, MPEG video, etc)

多播或遠端(單播)地址和端口

(4)爲接收媒體而需的信息(addresses, ports, formats and so on)

(5)使用的帶寬信息

(6)可信賴的接洽信息(Contact information)

二 sdp規格:

SDP會話描述由多行<type>=<value>組成。其中<type>是一個字符。<value>是一個字符串,其格式視<type>而定。整個協議區分大小寫。“=”兩側不允許有空格。

SDP會話描述由一個會話級描述(session_level description)和多個媒體級描述(media_level description)組成。會話級(session_level)的作用域是整個會話。其位置是從’v=’行開始到第一個媒體描述爲止。媒體級(media_level)描述是對單個的媒體流進行描述(例如傳送單個音頻或者視頻的vlc sdp文件只有短短的幾句話,從m=開始,這其實就是個媒體機描述),其位置是從’m=’行開始到下一個媒體描述爲止。總之,除非媒體部分重載,會話級的值是各個媒體的缺省默認值(就是說媒體級描述其實也是一個會話級描述,只不過沒寫出來的會話級描述參數都用的缺省值)。

SDP的結構如下:

Sessiondescription

        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 - notrequired if included in all media)

        b=* (bandwidth information)

        One or more time descriptions (seebelow)

        z=* (time zone adjustments)

        k=* (encryption key)

        a=* (zero or more session attributelines)

        Zero or more media descriptions (seebelow)

 

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 - optionalif included at session-level)

        b=* (bandwidth information)

        k=* (encryption key)

        a=* (zero or more media attributelines)

    上面的有些行是必需有的,有些行是可選的。可選的行有*號標記。必需的是v,o,s,t,m(這是對於會話級描述和媒體及描述總體而言的,對於媒體級描述而言只有m=是必須的)。注意所有的描述項必須按照上面的順序給出。

三 各個字段的描述:

 

1.Version(必選)

 

v=0

       SDP的版本號,不包括次版本號。

2.origion(必選)

o=<username> <sessionid> <version> <network type> <address type> <address>

 o=<用戶名> <session id> <會話版本> <網絡類型><地址類型> <地址>

 “o=”項對會話的發起者進行了描述。

<username>是用戶的登錄名。如果主機不支持<username>,則爲 ”-”。注意:<username>不能含空格。

     <session id>:是一個數字串。在整個會話中,必須是唯一的。爲了確保其唯一,建議使用NTP(Network Time Protocol)timestamp。

<version>:該會話公告的版本,供公告代理服務器檢測同一會話的若干個公告哪個是最新公告.基本要求是會話數據修改後該版本值遞增,建議用NTP時戳。

     <networktype>:網絡類型,一般爲”IN”,表示”internet”

     <address type>:地址類型,一般爲IP4

     <address>:地址

3.Session Name(必選)

 s=<sessionname>

 會話名,在整個會話中有且只有一個”s=”。

4.Connection Data(可選)

 c=<networktype> <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 multicastaddress>/<ttl>/<number of addresses>

如果<number of addresses>沒有給定,則默認爲1。

  c=INIP4 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

 5.Bandwidth(可選)

      b=<modifier>:<bandwidth-value>

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

<modifier>:包括兩種CT和AS。CT:ConferenceTotal,總帶寬。AS:Application-SpecificMaximum,單個媒體帶寬的最大值。

擴展機制:<modifier>以”X-”開始。建議modifier越短越好。例

b=X-YZ:128

 

6.Times(必選), RepeatTimesand Time Zones

     t=<start time>  <stop time>

     描述了會話的開始時間和結束時間。

     <start time> 和<stop time> 爲NTP時間,單位是秒。假如<stop time>爲零表示過了<start time>時間後會話一直持續。當<start time> 和<stoptime>均爲零時表示持久會話。

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

7.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=video49170/2 RTP/AVP 31

端口49170和49171爲第一對RTP/RTCP端口,49172和49173爲第二對的端口。傳輸協議是RTP/AVP,媒體格式爲31(媒體格式是rtp頭中payload參數對應的)。

    <transport>:傳輸協議,與c=行的地址類型有關。兩種: RTP/AVP,表示RealtimeTransport 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。在RTPAudio/Video profile中對應的payload type爲0。即:

m=audio49232 RTP/AVP 0

動態綁定的例子:16位線形編碼,採樣率爲16KHZ,假如我們希望動態RTP/AVP 類型98表示此此流,寫法如下:

 m=video49232 RTP/AVP 98

a=rtpmap:98 L16/16000/2

 

8.rtpmap(可選)

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

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

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

                             

                  m=audio 49230 RTP/AVP 96 97 98          m=audio 8888 RTP/AVP 0     m=video 1234 RTP/AVP 96

                  a=rtpmap:96 L8/8000                               a=rtpmap:0 pcma/8000/1        a=rtpmap:96 H264

                  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.SuggestedAttributes(可選)

    a=<TYPE>或 a=<TYPE>:<VALUES>

a=framerate:<幀速率>//單位:幀/秒        1s播放幾個rtp包  倒數爲一個rtp包承載的數據播放的時間單位s

                                    音頻的話       a=framerate:50        1byte*8000hz*20ms=160B

                                    則每個rtp包的音頻數據量爲160B  時間戳增值爲160

a=lang:<語言標記>//會話描述的缺省語言或媒體描述的語言

 

注:  如果SDP語法分析器不能識別某一類型(Type),則整個描述丟失。

       如果”a=”的某屬性值不理解,則予以丟失此屬性。

       會話級的描述就是媒體級描述的缺省值(就是說媒體級描述其實也是一個會話級描述,只不過沒寫出來的會話級描述參數都用的缺省值)。

 

四 舉例:

1.媒體級會話VLC播放264視頻的sdp文件

m=video 1234 RTP/AVP 96
a=rtpmap:96 H264
a=framerate:15
c=IN IP4 172.18.168.45

詳細:http://blog.csdn.net/zhangjikuan/article/details/27378237

2.媒體級會話VLC播放g711音頻的sdp文件

m=audio 8888 RTP/AVP 0   
a=rtpmap:0 pcma/8000/1                          這地方是a率壓縮方式;pcmu就是u率型
a=framerate:25                                 8000/25=320Byte    每個rtp包的音頻數據爲320byte   時間戳增值爲320
c=IN IP4 192.168.1.230

詳細:http://blog.csdn.net/zhangjikuan/article/details/27379201

如果是同時播放音頻和視頻流只要把這兩個媒體級會話合在一個sdp文件中就好了

 

3.點播mp4文件,MS_H返回給終端的sdp信息

 

v=0

o=HWPSS 3427743244 1084119141 IN IP4 127.0.0.1

s=test1.mp4

test1.mp4:媒體文件名

c=IN IP4 0.0.0.0

t=0 0

a=control:*

a=range:npt=0-44.000000

44.000000:mvhd原子:ntohl (movie_header->duration)/ ntohl(movie_header->time_scale)

 

m=video 0 RTP/AVP 96

96:track->payload_type     視頻:96音頻:97

a=control:trackID=101

101:軌道ID。 視頻:101,102, 103 音頻: 201,202, 203,204, 205

a=rtpmap:96 MP4V-ES/90000

90000:track->time_scale

a=fmtp:96 profile-level-id=2;config=000001b0020;

profile-level-id=2:   mp4v的子原子esds中得來

config=000001b0020: mp4v的子原子esds中得來

 

m=audio 0 RTP/AVP 97

a=control:trackID=201

a=rtpmap:97 mpeg4-generic/24000/1

24000: track->time_scale

1:mp4a的子原子esds中得來的

a=fmtp:97 streamtype=5;profile-level-id=15; mode=AAC-hbr; config=1308; SizeLength=13; IndexLength=3;IndexDeltaLength=3; Profile=1;

config=1308:mp4a的子原子esds中得來的

streamtype=5; profile-level-id=15; mode=AAC-hbr:寫死

SizeLength=13; IndexLength=3; IndexDeltaLength=3; Profile=1:寫死

  

4.直播

編碼器生成的sdp文件

v=0

o=- 2545495921 1885424500 IN IP4 192.168.225.158

s=111

c=IN IP4 192.168.225.153

b=RR:0

t=0 0

 

m=video 5088RTP/AVP 96

b=AS:949

a=rtpmap:96 H264/90000

a=fmtp:96 profile-level-id=4D4015;sprop-parameter-sets=Z01AFZZWCwSbCEiAAAH0AAAw1DBgAHP2AOg1cABQ,aO88gA==;packetization-mode=1

a=cliprect:0,0,576,352

a=framerate:25.

a=mpeg4-esid:201

a=x-envivio-verid:0002229D

 

m=audio 5090 RTP/AVP 97

b=AS:50

a=rtpmap:97 mpeg4-generic/24000/2

a=fmtp:97 profile-level-id=15; config=1310;streamtype=5; ObjectType=64; mode=AAC-hbr; SizeLength=13; IndexLength=3;IndexDeltaLength=3

a=mpeg4-esid:101

a=lang:eng

a=x-envivio-verid:0002229D

 

點播上面的sdp文件,MS_H傳給終端的sdp信息

v=0

MS_H全部是寫死的

 

o=- 1702415089 4281335390 IN IP4 127.0.0.1

s=live

c=IN IP4 0.0.0.0

t=0 0

a=control:*

a=range:npt=0-

 

m=video 5088 RTP/AVP 96

b=AS:949

a=rtpmap:96 H264/90000

a=fmtp:96 profile-level-id=4D4015;sprop-parameter-sets=Z01AFZZWCwSbCEiAAAH0AAAw1DBgAHP2AOg1cABQ,aO88gA==;packetization-mode=1

a=cliprect:0,0,576,352

a=framerate:25.

a=mpeg4-esid:201

a=x-envivio-verid:0002229D

a=control:trackID=103

此媒體描述是與編碼器的媒體描述是一樣的。

 

m=audio 5090 RTP/AVP 97

b=AS:50

a=rtpmap:97 mpeg4-generic/24000/2

a=fmtp:97 profile-level-id=15; config=1310;streamtype=5; ObjectType=64; mode=AAC-hbr; SizeLength=13; IndexLength=3;IndexDeltaLength=3

a=mpeg4-esid:101

a=lang:eng

a=x-envivio-verid:0002229D

a=control:trackID=201

此媒體描述是與編碼器的媒體描述是一樣的。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章