Posted by Veitch Kyrie's Blog on August 24, 2020

[转]vlc播放264 rtp流媒体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会话描述由多行=组成。其中是一个字符。是一个字符串,其格式视而定。整个协议区分大小写。“=”两侧不允许有空格。

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= <address type> <address>

 o=<用户名> <会话版本> <网络类型><地址类型> <地址>

 “o=”项对会话的发起者进行了描述。

是用户的登录名。如果主机不支持,则为 ”-”。注意:不能含空格。      :是一个数字串。在整个会话中,必须是唯一的。为了确保其唯一,建议使用NTP(Network Time Protocol)timestamp。 :该会话公告的版本,供公告代理服务器检测同一会话的若干个公告哪个是最新公告.基本要求是会话数据修改后该版本值递增,建议用NTP时戳。      :网络类型,一般为”IN”,表示”internet”     
:地址类型,一般为IP4      
:地址 3.Session Name(必选)  s=  会话名,在整个会话中有且只有一个”s=”。 4.Connection Data(可选)  c=
     表示媒体连接信息。      一个会话声明中,会话级描述中必须有”c=”项或者在每个媒体级描述中有一个”c=”项。可能在会话级描述和每个媒体级描述中都有”c=”项。      :网络类型,一般为”IN”,表示”internet”     
:地址类型,一般为IP4。      :应用程序必须处理域名和ip地址两种情形。单播时,为域名或ip地址,推荐使用域名;多播,为ip地址,且ip后面必须有TTL(取值范围是0-255),地址和TTL决定了多播包被传播的范围。例: c=IN IP4 224.2.1.1/127     分层编码方案是一个数据流被分为多层,接受者能够通过申请不同层的流选择流的质量(包括带宽)如下: // 如果没有给定,则默认为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=:       描述了建议的带宽,单位kilobits per second,可选。 :包括两种CT和AS。CT:ConferenceTotal,总带宽。AS:Application-SpecificMaximum,单个媒体带宽的最大值。 扩展机制:以”X-”开始。建议modifier越短越好。例 b=X-YZ:128   6.Times(必选), RepeatTimesand Time Zones      t=       描述了会话的开始时间和结束时间。       为NTP时间,单位是秒。假如为零表示过了时间后会话一直持续。当均为零时表示持久会话。      建议start time和stoptime不要设为0。因为不知道此会话的开始和结束时间,增加了调度(scheduling)的难度。 7.Media Announcements (必选)     m=     一个会话描述包括几个媒体描述。一个媒体描述以”m=”开始到下一个”m=”结束。     :表示媒体类型。有"audio", "video","application"(例白板信息), "data"(不向用户显示的数据) 和"control"(描述额外的控制通道)。    :媒体流发往传输层的端口。取决于c=行规定的网络类型和接下来的传送层协议:对UDP为1024-65535;对于RTP为偶数。当分层编码流被发送到一个单播地址时,需要列出多个端口。方式如下: m=/ 对于RTP,偶数端口被用来传输数据,奇数端口用来传输RTCP包。例: m=video49170/2 RTP/AVP 31 端口49170和49171为第一对RTP/RTCP端口,49172和49173为第二对的端口。传输协议是RTP/AVP,媒体格式为31(媒体格式是rtp头中payload参数对应的)。     :传输协议,与c=行的地址类型有关。两种: RTP/AVP,表示RealtimeTransport Protocol using the Audio/Video profile carried over UDP;UDP。 :媒体格式。对于音频和视频就是在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:/[/] 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=或 a=: 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 >m=video 1234 RTP/AVP 96         >a=rtpmap:96 H264 >a=framerate:15 >c=IN IP4 172.18.168.45 > > > >1.m=是媒体级会话的开始处,video:媒体类型 ; 1234:端口号    ;RTP/AVP:传输协议   ;96:rtp头中的payload格式 > >2.a=rtpmap:证明是动态绑定的进一步说明    ;96:rtp头中的payload格式;H264:编码名 ;缺省了时钟速率,应该为90000,这里的90000是指1s采集90000个字节 > >3.a=framerate:15    指1s播放几个rtp包,单位帧每秒,倒数为一个rtp包承载的数据播放的时间,单位s > >                                   90000/15   表示每个时间戳增量值 > >4.c=:媒体链接信息;IN:网络类型一般为IN;IP4:地址类型一般为IP4;后面是IP地址(注意是VLC所在的IP地址,不是发送方的IP) 详细: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 此媒体描述是与编码器的媒体描述是一样的。