SDP简要解析

SDP简要解析

1.概述
SDP也是MMUSIC工作组的一个产品,在MBONE内容中用得很多。其目的就是在媒体会话中,传递媒体流信息,允许会话描述的接收者去参与会话。SDP基本上在internet上工作。他定义了会话画描述的统一格式,但并不定义多播地址的分配和SDP消息的传输,也不支持媒体编码方案的协商,这些功能均由下层传送协议完成.典型的会话传送协议包括:SAP(Session AnnouncementProtocol 会话公告协议),SIP,RTSP,HTTP,和使用MIME的E-Mail.(注意:对SAP只能包含一个会话描述,其它会话传诵协议的SDP可包含多个绘画描述)

SDP包括以下一些方面:
1)会话的名称和目的
2)会话存活时间
3)包含在会话中的媒体信息,包括:
    媒体类型(video, audio, etc)
    传输协议(RTP/UDP/IP, H.320, etc)
    媒体格式(H.261 video, MPEG video, etc)
    多播或远端(单播)地址和端口
4)为接收媒体而需的信息(addresses, ports, formats and so on)
5)使用的带宽信息
6)可信赖的接洽信息(Contact information)
7)等。。。

2.协议:
Sessiondescription                //格式及举例
v=  (protocolversion)             //v=0
o=  (owner/creator and session identifier).  
                                                                       //o=<用户名><会话id><版本><网络类型><地址类型><地址>
                                                               //o=sname 1234567890 0987654321 I IP4 126.15.64.3
s=  (sessionname)                 //会话名
i=* (sessioninformation)           //会话信息
u=* (URI of description)           //u=http://www.zte.com.cn/staff/sdp.ps
e=* (emailaddress)                //e=zte@isi.edu(general text如:王生)
                                   //或e=Mr. Wang<wang@zte.com>
p=* (phone number)                 //p=+86-0755-26773000-7110(wang) or p=+1 617 253 6011
c=* (connection information -如已经包含在所有媒体中则该行不需要)
                                   //c=<网络类型><地址信息><连接地址>
                                   //多点会议包括TTL
                                   //连接地址: <base multicastaddress>/<ttl>/<number of addresses>
                                                                       //c=IN IP4 224.2.13.23/127
                                   //c=IN IP4 224.2.1.1/127/3
b=* (bandwidth information)        //b=<修改量(CT Conference Total
                                                                       //IAS Application-specific Max)>:<带宽值(kb/s)>
                                                                       //b=CT:120

One or more time descriptions (see below)
z=* (time zone adjustments)         //时区调整
k=* (encryptionkey)               //k=<方法>:<密钥>或k=<方法>
a=* (zero or more session attribute lines)    
                                                                       //a=<属性>  或a=<属性>:<值>
                                                                       
Zero or more mediadescriptions (see below)    
各行严格按顺序,其中:
时间描述:
t=  (time the session is active)    //<开始时间><结束时间>,单位秒,十进制NTP
                                                                       //t=2873397468 2873404969
r=* (zero or more repeat times)     //<重复时间><活动持续时间以开始时刻为参考的偏移列表>单位秒
                                                                       //r=604800 3666 90000 或写成r=7d 1h 0 25h

媒体描述:
m=  (media name and transport address)   
                                                                       //m=<媒体><端口><传送><格式列表>
                                   //m=audio 49170 RTP/AVP 0 3
                                   //协议为RTP,剖面为AVP
                                   //参考rtp-parameters.txt
i=* (mediatitle)                          //媒体称呼
c=* (connection information – 如已经包含在会话级描述则为可选)
b=* (bandwidth information)         //同c
k=* (encryptionkey)               //会话级为摸认值,同c
a=* (zero or more media attribute lines)             
                                                                       //两种形式:(也同c)(见后说明)
                                   //a=<attribute>如:
                                   //     a=recvonly
                                   //a=<attribute>:<value>
注:v,o,s,t,m为必须的,其他项为可选。
         如果SDP语法分析器不能识别某一类型(Type),则整个描述丢失;
         如果”a=”的某属性值不理解,则予以丢失
         整个协议区分大小写
         “=”两侧不允许有空格
         会话级的描述就是媒体级描述的缺省值
         所有均格式为<type>=<value>
        An example SDP description is:

        v=0
        o=mhandley 2890844526 2890842807 INIP4 126.16.64.4
        s=SDP Seminar
        i=A Seminar on the sessiondescription protocol
       u=http://www.cs.ucl.ac.uk/staff/M.Handley/sdp.03.ps
        e=mjh@isi.edu(Mark Handley)
        c=IN IP4 224.2.17.12/127
        t=2873397496 2873404696
        a=recvonly
        m=audio 49170 RTP/AVP 0
        m=video 51372 RTP/AVP 31
        m=application 32416 udp wb
        a=orient:portrait
//////////////////////////////////////////////////////////   
Protocol Version
     v=<version>       
//  v=0
      v:该SDP协议的版本号

Origin
   o=<username> <session id> <version> <networktype> <address type><address>
// o=mhandley 2890844526 2890842807 IN IP4 126.16.64.4
   o:标示了该会话的全局唯一性
   <username>:用于登陆创建主机的ID,若该主机不支持侧应为"-",该字段内不能包含空格
   <session id>:用于唯一的标示该会话描述,建议采用NetworkTime Protocol (NTP)的时间戳来保证唯一性
   <version>:该公告的版本号,用于区别同个会话内的多个公告
   <network type>:网络类型 IN(Internet)
   <address type>:地址类型 IP4/IP6
   <address>:该会话创建者的地址

SessionName
   s=<session name>
// s=SDP Seminar
   s:会话名,每个会话仅有一个

Sessionand Media Information
   i=<session description>
// i=A Seminar on the session description protocol
   i:会话信息,每个会话至多有一个,每个媒体至多有一个,常用于标识一个会话内多个同类型的媒体流。
  
URI
   u=<URI>
// u=http://www.cs.ucl.ac.uk/staff/M.Handley/sdp.03.ps
   u:该会话的URI(Universal Resource Identifier)地址

EmailAddress and Phone Number
   e=<email address>
   p=<phone number>
   e/p:添加会话负责人的私人信息
//   EMAIL地址格式:e=mjh@isi.edu (Mark Handley)or e=Mark Handley <mjh@isi.edu>
//   电话号码的格式:p=+44-171-380-7777 or p=+1 617253 6011

ConnectionData
   c=<network type> <address type> <connectionaddress>
// c=IN IP4 224.2.17.12/127
   c:连接数据,每个会话公告应包含一个连接描述在每个媒体描述中,
   单播的时候通过该IP地址发送,多播时通过TTL与IP地址共同决定那些包将被发送
   <connection address>:IP addr/TTL[/IP NUMS]example:192.168.1.2/127[/2],单播[多播]
   IP address together with TTL define which muticast pakets will be
   sent in this conference.
  
Bandwidth
   b=<modifier>:<bandwidth-value>
//....
     b:提供此次会话的带宽
     <modifier>:修改量
     CT Conference Total:固有的最大带宽值与多播骨干网的TTL值或一个特指的多播范围区相关连
     如果某一会话或媒体的带宽与最大带宽值不同,则通过该参数提供一个最大的限定值。该参数指定多个媒体总和的值。
     AS Application-Specific Maximum:该参数指定一个特殊应用的带宽,指定单一媒体的值。
  Extension Mechanism:X-..扩展的带宽定义

Times, Repeat Times and Time Zones
   t=<start time>  <stop time>
// t=2873397496 2873404696
     t:描述该会议的开始和结束时间,如果该会议在多个不规则的时间间隔内激活,可以使用多行t:描述
     如果时间间隔为规则的,可以使用"r="重复定义。
     <start time>:开始时间,以秒表示的NTP时间,开始结束时间都为0时被认为时永久的会议
     <stop time>:结束时间,以秒表示的NTP时间,结束时间为0时,该会议直到过了开始时间才开始
    
     r=<repeat interval> <active duration><list of offsets from start-time>
     <repeat interval>:重复间隔
     <active duration>:持续时间
     <list of offsets from start-time>:相对开始时间的偏移
    
     z=<adjustment time> <offset> <adjustmenttime> <offset> ....
// z=2882844526 -1h 2898848070 0
     z:<调整时间> <偏移>

Encryption Keys
   k=<method>
   k=<method>:<encryption key>
  
   k=clear:<encryption key> //<加密密钥>密钥没有变换
   k=base64:<encoded encryption key> //经base64加密的密钥,因为它含有SDP禁用的字符
   k=uri:<URI to obtain key> //URI携带密钥
   k=prompt //不采用密码,SDP没有提供密钥但该会话或媒体流是要求加密的。
  
Attributes  //该描述常被用于扩展SDP协议,分成“会话级”和“媒体级”两种属性
   a=<attribute>
   a=<attribute>:<value>
// a=recvonly
// a=orient:portrait
   a:媒体描述具备任意个“媒体级”的属性,用于附加表示媒体流的信息
   属性也可以被加在第一个媒体域,这些“会话级”属性用于附带表示会议的信息
   属性域一般有两种格式:
   <attribute>:性质属性,描述当前会话的性质
   <value>:
  
Media Announcements
   m=<media> <port> <transport> <fmt list>
   每个会话可以包含许多的媒体描述,
   <media>:媒体类型,包括audio/video/application/data/control,
   (音频/视频/应用[如:白板信息]/数据[不要向用户显示]/控制)
   当有新的媒体类型出项时,这些值将被扩展。
   <port>:端口类型,该值的确定取决于对应的"c="域中指定的网络
   和在第三个子项中定义的传输协议,UDP端口只能在1024-65535之间
   RTP端口可以是任意有效的范围,RTCP端口定义为大于对应RTP端口的奇数
   当分级的多个媒体流编码通过单一的地址发送时,我们必须指定多个端口用于传输。
   采用跟"c="域中定义多个IP地址的格式一样,
   m=<media> <port>/<number of ports><transport> <fmt list>
   example:  m=video 49170/2 RTP/AVP 31
   定义了两对的RTP/RTCP端口,4917019171和49172 49173
   <transport>:传输协议类型,该项的值依赖于"c="域中的网络类型
   IP4
   如果某个应用采用在UDP上使用单一组合了所
   有媒体格式和传输协议的模式传输,简单的方法是将传输协议指定为UDP,
   采用格式列表区别组合的协议,区别传输类型和媒体格式是必要的。
  
   <fmt list>:格式列表,对音频和视频应用,该值表示媒体的有效负荷类型
   一旦这个格式列表被限定,在这个会话过程中都将使用列表里面的有效负荷类型
   ,但第一个类型将被作为默认值。
   如果媒体流的传输模式不是RTP/UDP,格式将在附加的文件中进行定义。
   如果通过RTP传输,SDP可以提供静态和动态绑定的两种RTP编码有效负荷类型。
   静态绑定类型的类型值提供确定的有效负荷类型,动态绑定必须通过后续的选项
   来进一步的说明。
   例如:m=video 49232 RTP/AVP 0 //定义负荷类型为0的媒体流从49232端口发送
               m=video 49232 RTP/AVP 98
         a=rtpmap:98 L16/16000/2 //采用采样频率为16KHZ 16bit的立体声线性编码
        
     rtpmap属性对"m="描述的格式列表的负荷类型进行详细说明,
     通用的rtpmap属性的格式为:
     a=rtpmap:<payload type> <encodingname>/<clock rate>[/<encoding parameters>]
     <payload type>
     <encoding name>:编码名,扩展的用X-开始
     <clock rate>:采样频率
     <encoding parameters>:对语音编码来说,该参数表示语音声道。
     对视频编码不提供该参数。
     RTP格式列表没提供对每个媒体包包括几个采样点进行说明,
     如果没有默认值,需要通过"ptime"说明。
    
     非RTP媒体采用MIME文本类型编码,如:m=application 32416 udp wb

Suggested Attributes
推荐的属性
   a=cat:<category>
   cat:描述离散分级的会话类型,使接受者通过该参数过率不想要的会话类型

   a=keywds:<keywords>
   keywds:该参数辅助接收者根据关键字过虑会话,鉴别想要会话类型。
  
   a=tool:<name and version of tool>
   tool:该参数提供给SDP创建者名字和版本号。

   a=ptime:<packet time>
   ptime:该参数提供一个以毫秒为单位的打包长度,媒体级属性
 
   a=recvonly
   a=sendrecv
   a=sendonly
     发送模式,会话级属性。
    
   a=orient:<whiteboard orientation>
   该参数指定白板应用中屏幕的方向性,
   允许值为`portrait',`landscape' and `seascape'(upside down landscape).

   a=type:<conference type>
   该参数指定会议类型,
   允许值为:`broadcast', `meeting', `moderated',`test' and `H332'.
   broadcast会话默认为recvonly
   meeting默认sendrecv
  
   a=charset:<character set>
   该参数指定会话名和信息值的字符集
   a=charset:ISO-8859-1
  
   a=sdplang:<language tag>
   描述该会话的描述的语言

   a=lang:<language tag>"session-level" and "media-level"
   SDP描述使用的语言,媒体的语言

   a=framerate:<frame rate>
   该参数描述视频的最大帧数(frames/sec),允许(整数.小数)格式

   a=quality:<quality>
   该参数用0-10的整数值描述建议的编码质量,
   对视频来说为了在帧速率和持续图像质量间指定一个非默认的平衡值
       10 - 最佳图像质量

       5 - 无质量建议

       0 - 最差图像质量

   a=fmtp:<format> <format specificparameters>
   该属性值指定一个SDP不了解的特殊格式,该格式是媒体的格式的一种。 
   定义指定格式的附加参数  
3.语法
announcement =        proto-version
                        origin-field
                        session-name-field
                        information-field
                        uri-field
                        email-fields
                        phone-fields
                        connection-field
                        bandwidth-fields
                        time-fields
                        key-field
                        attribute-fields
                        media-descriptions

   proto-version=       "v=" 1*DIGIT CRLF
                        ;this memo describes version 0
   origin-field =       "o=" username space
                        sess-id space sess-version space
                        nettype space addrtype space
                        addr CRLF
   session-name-field =  "s=" text CRLF
   information-field =   ["i=" text CRLF]
   uri-field=           ["u="uri CRLF]
   email-fields =       *("e=" email-address CRLF)
   phone-fields =       *("p=" phone-number CRLF)
   connection-field =    ["c=" nettype spaceaddrtype space
                        connection-address CRLF]
                        ;a connection field must be present
                        ;in every media description or at the
                        ;session-level
   bandwidth-fields =    *("b=" bwtype":" bandwidth CRLF)
   time-fields =         1*("t=" start-time space stop-time
                        *(CRLF repeat-fields) CRLF)
                        [zone-adjustments CRLF]
   repeat-fields =       "r="repeat-interval space typed-time
                        1*(space typed-time)
   zone-adjustments =    time space ["-"]typed-time
                        *(space time space ["-"] typed-time)
   key-field=           ["k="key-type CRLF]
   key-type=           "prompt" |
                        "clear:" key-data |
                        "base64:" key-data |
                        "uri:" uri
   key-data=            email-safe| "~" | "
   attribute-fields =    *("a=" attributeCRLF)
   media-descriptions =  *( media-field
                        information-field
                        *(connection-field)
                        bandwidth-fields
                        key-field
                        attribute-fields )
   media-field =        "m=" media space port ["/" integer]
                        space proto 1*(space fmt) CRLF
   media=              1*(alpha-numeric)
                        ;typically "audio", "video", "application"
                        ;or "data"
   fmt=                1*(alpha-numeric)
                        ;typically an RTP payload type for audio
                        ;and video media
   proto=              1*(alpha-numeric)
                        ;typically "RTP/AVP" or "udp" for IP4
   port=               1*(DIGIT)
                        ;should in the range "1024" to "65535" inclusive
                        ;for UDP based media
   attribute=           (att-field":" att-value) | att-field
   att-field=           1*(alpha-numeric)
   att-value=           byte-string
   sess-id=            1*(DIGIT)
                        ;should be unique for this originating username/host
   sess-version =        1*(DIGIT)
                        ;0 is a new session
   connection-address =  multicast-address
                        | addr
   multicast-address =   3*(decimal-uchar ".")decimal-uchar "/" ttl
                        [ "/" integer ]
                        ;multicast addresses may be in the range
                        ;224.0.0.0 to 239.255.255.255
   ttl=                decimal-uchar
   start-time =         time | "0"
   stop-time=           time |"0"
   time=               POS-DIGIT 9*(DIGIT)
                        ;sufficient for 2 more centuries
   repeat-interval =     typed-time
   typed-time =         1*(DIGIT) [fixed-len-time-unit]
   fixed-len-time-unit = "d" | "h" |"m" | "s"
   bwtype=             1*(alpha-numeric)
   bandwidth=           1*(DIGIT)
   username=            safe
                        ;pretty wide definition, but doesn't include space
   email-address =       email | email"(" email-safe ")" |
                        email-safe "<" email ">"
   email=              ;defined in RFC822
  uri=                 ;defined in RFC1630
   phone-number =        phone |phone "(" email-safe ")" |
                        email-safe "<" phone ">"
   phone=              "+" POS-DIGIT 1*(space | "-" | DIGIT)
                        ;there must be a space or hyphen between the
                        ;international code and the rest of the number.
   nettype=            "IN"
                        ;list to be extended
   addrtype=           "IP4" | "IP6"
                        ;list to be extended
   addr=               FQDN | unicast-address
   FQDN=               4*(alpha-numeric|"-"|".")
                        ;fully qualified domain name as specified in RFC1035
   unicast-address =     IP4-address |IP6-address
   IP4-address =         b1"." decimal-uchar "." decimal-uchar "." b4
   b1=                 decimal-uchar
                        ;less than "224"; not "0" or "127"
   b4=                 decimal-uchar
                        ;not "0"
   IP6-address =         ;tobe defined
   text=               byte-string
                        ;default is to interpret this as IS0-10646 UTF8
                        ;ISO 8859-1 requires a "a=charset:ISO-8859-1"
                        ;session-level attribute to be used
   byte-string =        1*(0x01..0x09|0x0b|0x0c|0x0e..0xff)
                        ;any byte except NUL, CR or LF
   decimal-uchar =       DIGIT
                        | POS-DIGIT DIGIT
                        | ("1" 2*(DIGIT))
                        | ("2"("0"|"1"|"2"|"3"|"4") DIGIT)
                        | ("2" "5"("0"|"1"|"2"|"3"|"4"|"5"))
   integer=            POS-DIGIT *(DIGIT)
   alpha-numeric =       ALPHA | DIGIT
   DIGIT=              "0" | POS-DIGIT
   POS-DIGIT=          "1"|"2"|"3"|"4"|"5"|"6"|"7"|"8"|"9"
   ALPHA=              "a"|"b"|"c"|"d"|"e"|"f"|"g"|"h"|"i"|"j"|"k"|
                        "l"|"m"|"n"|"o"|"p"|"q"|"r"|"s"|"t"|"u"|"v"|
                        "w"|"x"|"y"|"z"|"A"|"B"|"C"|"D"|"E"|"F"|"G"|
                        "H"|"I"|"J"|"K"|"L"|"M"|"N"|"O"|"P"|"Q"|"R"|
                        "S"|"T"|"U"|"V"|"W"|"X"|"Y"|"Z"
   email-safe =         safe | space | tab
   safe=               alpha-numeric |
                        "'" | "'" | "-" | "." | "/" |":" | "?" | """ |
                        "#" | "$" | "&" | "*" |";" | "=" | "@" | "[" |
                        "]" | "^" | "_" | "`" | "{" |"|" | "}" | "+" |
                        "~" | "
   space=              %d32
   tab=                %d9
   CRLF=               %d13.10

SDP格式讲解SDP: SessionDescription Protocol

2010-05-25 14:35

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)
        One or more time descriptions (see below)
        z=* (time zone adjustments)
        k=* (encryption key)
        a=* (zero or more session attribute lines)
        Zero or more media descriptions (see below)
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)

---------------------------------------------------------------------------------
m=<media> <port>/<number of ports> <transport> <fmt list>

m=<media> <port>/<number of ports> <transport> <fmt list>
如m=video 49170/2 RTP/AVP 31

would specify that ports 49170 and 49171 form one RTP/RTCP pair and
     49172 and 49173 form the second RTP/RTCP pair. RTP/AVP is the
     transport protocol and 31 is the format (see below).

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

c=<network type> <address type> <connection address>
其中<connection address>是如下格式:

<base multicast address>/<ttl>/<number of addresses>

如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
t=<start time> <stop time>
r=<repeat interval> <active duration> <list of offsets from start-time>


RTP/AVP - the IETF's Realtime Transport Protocol using the
       Audio/Video profile carried over UDP.

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

<encoding parameters> may specify the number of audio channels.

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

更详细参考http://tools.ietf.org/html/rfc2327

PT encoding media typeclock rate channels
name (Hz)
___________________________________________________
0 PCMU A 8,000 1
1 reserved A
2 reserved A
3 GSM A 8,000 1
4 G723 A 8,000 1
5 DVI4 A 8,000 1
6 DVI4 A 16,000 1
7 LPC A 8,000 1
8 PCMA A 8,000 1
9 G722 A 8,000 1
10 L16 A 44,100 2
11 L16 A 44,100 1
12 QCELP A 8,000 1
13 CN A 8,000 1
14 MPA A 90,000 (see text)
15 G728 A 8,000 1
16 DVI4 A 11,025 1
17 DVI4 A 22,050 1
18 G729 A 8,000 1
19 reserved A
20 unassigned A
21 unassigned A
22 unassigned A
23 unassigned A
dyn G726-40 A 8,000 1
dyn G726-32 A 8,000 1
dyn G726-24 A 8,000 1
dyn G726-16 A 8,000 1
dyn G729D A 8,000 1
dyn G729E A 8,000 1
dyn GSM-EFR A 8,000 1
dyn L8 A var. var.
dyn RED A (see text)
dyn VDVI A var. 1

Table 4: Payload types (PT) for audio encodings

PT encoding media type clock rate
name (Hz)
_____________________________________________
24 unassigned V
25 CelB V 90,000
26 JPEG V 90,000
27 unassigned V
28 nv V 90,000
29 unassigned V
30 unassigned V
31 H261 V 90,000
32 MPV V 90,000
33 MP2T AV 90,000
34 H263 V 90,000
35-71 unassigned ?
72-76 reserved N/A N/A
77-95 unassigned ?
96-127 dynamic ?
dyn H263-1998 V 90,000

Table 5: Payload types (PT) for video and combined
encodings

 

a=rtpmap:103 ISAC/16000
a=rtpmap:102 iLBC/8000
a=rtpmap:3 GSM/8000
a=rtpmap:106 telephone-event/8000
a=rtpmap:13 CN/8000
a=rtpmap:117 red/8000
a=rtpmap:18 G729a/8000
a=rtpmap:0 PCMU/8000
a=rtpmap:2 G726-32/8000
a=rtpmap:4 G723/8000
a=rtpmap:8 PCMA/8000
a=rtpmap:96 G726-40/8000
a=rtpmap:97 G726-24/8000
a=rtpmap:98 G726-16/8000
a=rtpmap:100 NSE/8000
a=rtpmap:101 telephone-event/8000
a=rtpmap:0 pcmu/8000
a=rtpmap:8 pcma/8000
a=rtpmap:3 gsm/8000
a=rtpmap:18 G729/8000
a=rtpmap:98 iLBC/8000
a=rtpmap:97 speex/8000
a=rtpmap:101 telephone-event/8000

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值