1、 流媒体相关内容总结 精品文档 流媒体相关内容总结 1 RTSP协议 RTSP(Real Time Stream Protocol,实时流协议[RFC 2326])是研究如何有效地在IP网络上传输流媒体数据的应用层协议。 RTSP的消息有两大类,一是请求消息(request),一是回应消息(response),两种消息的格式不同. 请求消息: 方法 URI RTSP版本 CR LF 消息头 CR LF CR LF 消息体 CR LF 回应消息: RTSP版本 状态码 解释 CR LF
2、
消息头 CR LF CR LF
消息体 CR LF
其中RTSP版本一般都是RTSP/1.0,状态码是一个数值,200表示成功,解释是与状态码对应的文本解释。
1.1 流媒体服务器
Windows Media Server:支持mms协议
Helix Server:推送协议为私有协议,播放协议使用RTSP
Darvin Streaming Server:支持RTSP推送和播放。如果是点播播放,本地文件需要索引化。
1.2 SDP格式
sdp的格式
v=
3、network type>
s=4、 start-time>
z=
5、电话号码) c = * (连接信息) b = * (带宽信息) z = * (时间区域调整) k = * (加密密钥) a = * (0 个或多个会话属性行) 时间描述: t = (会话活动时间) r = * (0或多次重复次数) 媒体描述: m = (媒体名称和传输地址) i = * (媒体标题) c = * (连接信息 — 如果包含在会话层则该字段可选) b = * (带宽信息) k = * (加密密钥) a = * (0 个或多个媒体属性行) 1.3 例子 以AAC推送流为例。具体代码:DeviceHandler/AACHa
6、ndler && StreamSender 1.3.1 推送过程 [2009-12-29 9:58:02:234] ANNOUNCE rtsp://202.102.126.10/0123456789ABCDEF.sdp RTSP/1.0 CSeq:3452816846 Content-Type:application/sdp Content-Length:303 v=0 o=streamsender 0 0 IN IP4 0.0.0.0 c=IN IP4 202.102.126.10 a=tool:sdr v2.4a6 m=audio 0 RTP/AVP 96 a=
7、control:trackID=0 a=rtpmap:96 mpeg4-generic/44100/2 a=fmtp:96 streamtype=5; profile-level-id=15; mode=AAC-hbr; config=1210; SizeLength=13; IndexLength=3; IndexDeltaLength=3; a=mpeg4-esid:101 [2009-12-29 9:58:02:265] RTSP/1.0 200 OK Server: DSS/5.5.5 (Build/489.16; Platform/Win32; Release/Dar
8、win; state/beta; ) Cseq: 3452816846 [2009-12-29 9:58:02:265] SETUP rtsp://202.102.126.10/0123456789ABCDEF.sdp/trackID=0 RTSP/1.0 CSeq:3452816847 Transport:RTP/AVP/TCP;unicast;mode=record;interleaved=0-1 [2009-12-29 9:58:02:265] RTSP/1.0 200 OK Server: DSS/5.5.5 (Build/489.16; Platfor
9、m/Win32; Release/Darwin; state/beta; ) Cseq: 3452816847 Cache-Control: no-cache Session: 134866268081914 Date: Tue, 29 Dec 2009 01:58:17 GMT Expires: Tue, 29 Dec 2009 01:58:17 GMT Transport: RTP/AVP/TCP;unicast;mode=record;interleaved=0-1 [2009-12-29 9:58:02:265] RECORD rtsp://202.102.12
10、6.10/0123456789ABCDEF.sdp RTSP/1.0 CSeq: 3452816848 Session: 134866268081914 [2009-12-29 9:58:02:281] RTSP/1.0 200 OK Server: DSS/5.5.5 (Build/489.16; Platform/Win32; Release/Darwin; state/beta; ) Cseq: 3452816848 Session: 134866268081914 RTP-Info: url=rtsp://202.102.126.10/0123456789ABC
11、DEF.sdp/trackID=0 1.3.2 播放过程 [2009-12-29 9:58:47:765] OPTIONS rtsp://202.102.126.10:1554/0123456789ABCDEF RTSP/1.0 CSeq: 6 User-Agent: VLC media player (LIVE555 Streaming Media v2009.04.20) [2009-12-29 9:58:47:765] RTSP/1.0 200 OK Server: DSS/5.5.5 (Build/489.16; Platform/Win32; Release/
12、Darwin; state/beta; ) Cseq: 6 Public: DESCRIBE, SETUP, TEARDOWN, PLAY, PAUSE, OPTIONS, ANNOUNCE, RECORD [2009-12-29 9:58:47:765] DESCRIBE rtsp://202.102.126.10:1554/0123456789ABCDEF RTSP/1.0 CSeq: 7 Accept: application/sdp User-Agent: VLC media player (LIVE555 Streaming Media v2009.04.20)
13、 [2009-12-29 9:58:47:765] RTSP/1.0 200 OK Server: DSS/5.5.5 (Build/489.16; Platform/Win32; Release/Darwin; state/beta; ) Cseq: 7 Cache-Control: no-cache Content-length: 341 Date: Tue, 29 Dec 2009 01:59:02 GMT Expires: Tue, 29 Dec 2009 01:59:02 GMT Content-Type: application/sdp x-Accept
14、Retransmit: our-retransmit x-Accept-Dynamic-Rate: 1 Content-Base: rtsp://202.102.126.10:1554/0123456789ABCDEF/ v=0 o=streamsender 0 0 IN IP4 0.0.0.0 s=\0123456789ABCDEF.sdp c=IN IP4 0.0.0.0 t=0 0 a=tool:sdr v2.4a6 a=control:* m=audio 0 RTP/AVP 96 a=control:trackID=0 a=rtpmap:96 mpeg4-
15、generic/44100/2 a=fmtp:96 streamtype=5; profile-level-id=15; mode=AAC-hbr; config=1210; SizeLength=13; IndexLength=3; IndexDeltaLength=3; a=mpeg4-esid:101 [2009-12-29 9:58:47:781] SETUP rtsp://202.102.126.10:1554/0123456789ABCDEF/trackID=0 RTSP/1.0 CSeq: 8 Transport: RTP/AVP/TCP;unicast;inte
16、rleaved=0-1 User-Agent: VLC media player (LIVE555 Streaming Media v2009.04.20) [2009-12-29 9:58:47:781] RTSP/1.0 200 OK Server: DSS/5.5.5 (Build/489.16; Platform/Win32; Release/Darwin; state/beta; ) Cseq: 8 Cache-Control: no-cache Session: 14027363211279 Date: Tue, 29 Dec 2009 01:58:17 G
17、MT Expires: Tue, 29 Dec 2009 01:58:17 GMT Transport: RTP/AVP/TCP;unicast;interleaved=0-1 [2009-12-29 9:58:47:781] PLAY rtsp://202.102.126.10:1554/0123456789ABCDEF/ RTSP/1.0 CSeq: 9 Session: 14027363211279 Range: npt=0.000- User-Agent: VLC media player (LIVE555 Streaming Media v2009.04.20
18、) [2009-12-29 9:58:47:796] RTSP/1.0 200 OK Server: DSS/5.5.5 (Build/489.16; Platform/Win32; Release/Darwin; state/beta; ) Cseq: 9 Session: 14027363211279 Range: npt=now- RTP-Info: url=rtsp://202.102.126.10:1554/0123456789ABCDEF/trackID=0 2 RTP协议 RTP(Real-time Transport Protocol,实时
19、传输协议[RFC 1889]、[RFC 3550]、[RFC 3551]),它是由IETF的多媒体传输工作小组1996年在RFC 1889中公布的。RTP 本身并没有提供按时发送机制或其它服务质量(QoS)保证,它依赖于低层服务去实现这一过程。 RTP 并不保证传送或防止无序传送,也不确定底层网络的可靠性。 RTP 实行有序传送, RTP 中的序列号允许接收方重组发送方的包序列。 参考StreamSender项目。 /* tcp通道中传输rtp数据。size:4 */ struct _rtpTcpHead { u_int8 symbol; //$,0x24 u_int8 ch
20、annelId; //interlevel u_int16 len; //rtp包长度,不包括_rtpTcpHead的长度。 }; /* rtp包头。size:12 */ struct _rtpHead { /* rtp */ u_int8 RTP_CC:4; //0 u_int8 RTP_PX:2; //0 u_int8 RTP_VER:2; //版本号:2 u_int8 RTP_PT:7; //负载类型 u_int8 RTP_MARK:1; //是否是帧的最后分片 u_int16 RTP_SEQUENCE;
21、 //序列号,网络序 u_int32 RTP_TIMESTAMP; //时间戳,网络序,时间戳增量和采样率关系很大 u_int32 RTP_SSRC; //同步源标识,网络序 }; 图形表示为: 3 RTP负载 首先要说明的是,音频帧的固定长度是1024(编码前)。 3.1 H264 参考[RFC 3984],代码参考DeviceHandler/StreamSender。 H264原始流以00 00 00 01(4字节)或00 00 01(3字节)开头,紧跟的是1字节的网络抽象层单元NALU。RTP传输H264流的时候,将“0001”头去掉。 SDP有两个参数pr
22、ofile-level-id和sprop-parameter-sets,这两个参数由0x67…0x68…结构的数据生成,生成方法参考StreamH264。 3.1.1 结构定义 下面定义了单帧、分片的结构,组包的结构复杂些。 /* * H264头, FU-A */ /* 网络抽象层单元NALU*/ struct _nalu { u_int8 Type:5; u_int8 NRI:2; u_int8 F:1; }; 单帧模式就是原h264流 /* 单一NAL 单元模式*/ typedef _nalu _h264SingleFrameHead;
23、 /* 分片模式*/ 分片模式有两种类型: 28 | FU-A | Fragmentation unit 29 | FU-B | Fragmentation unit 一般使用的是FU-A类型。 typedef _nalu _fuIndicator; struct _fuHeader { u_int8 Type:5; u_int8 R:1;//0 u_int8 E:1;//结束位 u_int8 S:1;//开始位 }; struct _h264FUHead { _fuIndicator fuIndicator; _fuHeader fuHea
24、der; }; /* 组包模式*/ 组包模式有四种,两种单时间组合包, 24 | STAP-A | Single-time aggregation packet 25 | STAP-B | Single-time aggregation packet 和两种多时间组合包, 26 | MTAP16 | Multi-time aggregation packet 27 | MTAP24 | Multi-time aggregation packet 一般使用的是STAP-A,这种模式的格式为: RTPHeader(12字节) – STAP-A NALU(1字节) – fram
25、eSize(2)—frame—frameSize—frame--…,与MPEG4组包是不同的,可对比着看。 3.1.2 推送过程 [2009-12-30 15:09:45:843] ANNOUNCE rtsp://202.102.126.10/0123456789ABCDEF.sdp RTSP/1.0 CSeq:1 Content-Type:application/sdp Content-Length:328 v=0 o=streamsender 0 0 IN IP4 0.0.0.0 c=IN IP4 202.102.126.10 a=tool:
26、sdr v2.4a6 m=video 554 RTP/AVP 96 a=control:trackID=0 a=rtpmap:96 H264/90000 a=fmtp:96 packetization-mode=1;profile-level-id=42e014;sprop-parameter-sets=Z0LgFNoFglE=,aM4wpA== a=mpeg4-esid:201 a=Width:integer;352 a=Height:integer;288 a=framerate:5 [2009-12-30 15:09:45:843] RTSP/1.0 200 OK
27、 Server: DSS/5.5.5 (Build/489.16; Platform/Win32; Release/Darwin; state/beta; ) Cseq: 1 [2009-12-30 15:09:45:875] SETUP rtsp://202.102.126.10/0123456789ABCDEF.sdp/trackID=0 RTSP/1.0 CSeq:2 Transport:RTP/AVP/TCP;unicast;mode=record;interleaved=0-1 [2009-12-30 15:09:45:890] RTSP/1.0 20
28、0 OK Server: DSS/5.5.5 (Build/489.16; Platform/Win32; Release/Darwin; state/beta; ) Cseq: 2 Cache-Control: no-cache Session: 26813480845923 Date: Wed, 30 Dec 2009 07:10:00 GMT Expires: Wed, 30 Dec 2009 07:10:00 GMT Transport: RTP/AVP/TCP;unicast;mode=record;interleaved=0-1 [2009-12-30 15
29、09:45:906] RECORD rtsp://202.102.126.10/0123456789ABCDEF.sdp RTSP/1.0 CSeq: 3 Session: 26813480845923 [2009-12-30 15:09:45:906] RTSP/1.0 200 OK Server: DSS/5.5.5 (Build/489.16; Platform/Win32; Release/Darwin; state/beta; ) Cseq: 3 Session: 26813480845923 RTP-Info: url=rtsp://202.102.12
30、6.10/0123456789ABCDEF.sdp/trackID=0 3.1.3 播放过程 [2009-12-30 15:10:30:859] OPTIONS rtsp://202.102.126.10:1554/0123456789ABCDEF RTSP/1.0 CSeq: 1 User-Agent: VLC media player (LIVE555 Streaming Media v2009.04.20) [2009-12-30 15:10:30:859] RTSP/1.0 200 OK Server: DSS/5.5.5 (Build/489.16; Pl
31、atform/Win32; Release/Darwin; state/beta; ) Cseq: 1 Public: DESCRIBE, SETUP, TEARDOWN, PLAY, PAUSE, OPTIONS, ANNOUNCE, RECORD [2009-12-30 15:10:30:859] DESCRIBE rtsp://202.102.126.10:1554/0123456789ABCDEF RTSP/1.0 CSeq: 2 Accept: application/sdp User-Agent: VLC media player (LIVE555 Strea
32、ming Media v2009.04.20) [2009-12-30 15:10:30:875] RTSP/1.0 200 OK Server: DSS/5.5.5 (Build/489.16; Platform/Win32; Release/Darwin; state/beta; ) Cseq: 2 Cache-Control: no-cache Content-length: 364 Date: Wed, 30 Dec 2009 07:10:00 GMT Expires: Wed, 30 Dec 2009 07:10:00 GMT Content-Type: a
33、pplication/sdp x-Accept-Retransmit: our-retransmit x-Accept-Dynamic-Rate: 1 Content-Base: rtsp://202.102.126.10:1554/0123456789ABCDEF/ v=0 o=streamsender 0 0 IN IP4 0.0.0.0 s=\0123456789ABCDEF.sdp c=IN IP4 0.0.0.0 t=0 0 a=tool:sdr v2.4a6 a=control:* m=video 0 RTP/AVP 96 a=control:track
34、ID=0 a=rtpmap:96 H264/90000 a=fmtp:96 packetization-mode=1;profile-level-id=42e014;sprop-parameter-sets=Z0LgFNoFglE=,aM4wpA== a=mpeg4-esid:201 a=Width:integer;352 a=Height:integer;288 a=framerate:5 [2009-12-30 15:10:30:906] SETUP rtsp://202.102.126.10:1554/0123456789ABCDEF/trackID=0 RTSP/1
35、0 CSeq: 3 Transport: RTP/AVP;unicast;client_port=2770-2771 User-Agent: VLC media player (LIVE555 Streaming Media v2009.04.20) [2009-12-30 15:10:30:921] RTSP/1.0 200 OK Server: DSS/5.5.5 (Build/489.16; Platform/Win32; Release/Darwin; state/beta; ) Cseq: 3 Cache-Control: no-cache Session
36、 60374355309628 Date: Wed, 30 Dec 2009 07:10:45 GMT Expires: Wed, 30 Dec 2009 07:10:45 GMT Transport: RTP/AVP;unicast;source=202.102.126.10;client_port=2770-2771;server_port=6970-6971 [2009-12-30 15:10:30:921] PLAY rtsp://202.102.126.10:1554/0123456789ABCDEF/ RTSP/1.0 CSeq: 4 Session: 60
37、374355309628 Range: npt=0.000- User-Agent: VLC media player (LIVE555 Streaming Media v2009.04.20) [2009-12-30 15:10:30:921] RTSP/1.0 200 OK Server: DSS/5.5.5 (Build/489.16; Platform/Win32; Release/Darwin; state/beta; ) Cseq: 4 Session: 60374355309628 Range: npt=now- RTP-Info: url=rtsp:/
38、/202.102.126.10:1554/0123456789ABCDEF/trackID=0 3.2 MPEG4 MPEG4传输参考[RFC 3016]、[RFC 3640]两篇文档,其中,[RFC 3016]支持“mp4V-ES”视频传输方式,还支持“mp4A-LATM”AAC音频传输方式,但是,据说它没有使用MPEG4的同步技术和流管理技术;[RFC 3640]支持“mpeg4-generic”方式传输音视频,还支持传输其它的ES流,如系统流等。 MPEG4视频一般采用mp4V-ES方式,AAC一般采用mpeg4-generic方式。 图3-2 MPEG4的RTP负载结构
39、图3-2是MPEG4的RTP负载结构,其中,AU Header Length是2字节长度,表示AU Header的总位数,并且是网络字节序。AU Header包含一些可选的字段,长度不固定,包含字段具体在SDP头中指定。如果AU Header的总位数不是8的倍数,那么AU Header最后要添加填充位,位值为0,这时AU Header Length长度不包括填充位的长度。 另外,[RFC 3640]上面还指出“The Auxiliary Section”段,因为这个段一般不用,所以没有考虑。 [RFC 3640] “3.2.1.1 The AU-header”一节中详细的介绍了AU He
40、ader的字段。 3.2.1 AAC 参考[RFC 3640]。[RFC 3640]介绍了负载AAC的两种模式,Low Bit-rate AAC和High Bit-rate AAC,我使用的是High Bit-rate AAC。High Bit-rate AAC模式支持AAC帧大小可变,帧最大长度是8191字节。 High Bit-rate AAC模式需要在SDP中指定mode=AAC-hbr, AU Header只包含了两个字段AU-size(13位)和AU-Index(3位),这样AU Header的长度正好为2字节,AU-Index填充为0, AU-size是网络字节序。 传
41、输AAC帧不需要包含ADTS头,RTP单帧、分片、组包传输除了RTP头字段中的RTP_MARK没有特别需要注意的地方。 AAC网络流使用ADTS格式保存,ADTS指Audio Data Transport Stream,它依次包含固定头(28位)和可变头(28位)两部分,它们的具体结构如下: adts_fixed_header() { syncword; 12位 ID; 1位 layer; 2位 protection_absent; 1位 profile; 2位 sampling_frequency_index; 4位 private_bit; 1位 channel_co
42、nfiguration; 3位 original/copy; 1位 home; 1位 } adts_variable_header() { copyright_identification_bit; 1位 copyright_identification_start; 1位 frame_length; 13位 adts_buffer_fullness; 11位 number_of_raw_data_blocks_in_frame; 2位 } 详细说明下ADTS头的重要数据部分: syncword 同步字The bit string ‘1111 1111 111
43、1’,说明一个ADTS帧的开始。 ID MPEG 标示符, 设置为1. layer Indicates which layer is used. Set to ‘00’ protection_absent 表示是否误码校验 profile 表示使用哪个级别的AAC,如01 Low Complexity(LC)--- AACLC 0 Main profile 1 Low Complexity profile (LC) 2 Scalable Sampling Rate profile (SSR) 3 (reserved) sampling_frequenc
44、y_index 表示使用的采样率下标 sampling_frequency_index sampling frequeny [Hz] 0x0 96000 0x1 88200 0x2 64000 0x3 48000 0x4 44100 0x5 32000 0x6
45、 24000 0x7 22050 0x8 16000 0x9 2000 0xa 11025 0xb 8000 0xc reserved 0xd reserved 0xe
46、 reserved 0xf reserved channel_configuration 表示声道数 frame_length 一个ADTS帧的长度包括ADTS头和raw data block. adts_buffer_fullness 0x7FF 说明是码率可变的码流 number_of_raw_data_blocks_in_frame 表示ADTS帧中有 number_of_raw_data_blocks_in_frame + 1个AAC原始帧. 所以说number_of_raw_d
47、ata_blocks_in_frame == 0 表示说ADTS帧中有一个AAC数据块并不是说没有。(一个AAC原始帧包含一段时间内1024个采样及相关数据) AAC的RTP推送过程、播放过程及SDP的例子参见1.2节,RTP数据传输参考DeviceHandler/StreamSender/StreamAAC.cpp和DeviceHandler/AACHandler/aacHander.cpp。 SDP中有个参数config,它对应AudioSpecificConfig结构: AudioSpecificConfig两字节,它的16进制的字符串就是config。 3.2.2 视频
48、参考[RFC 3016]、[live555 MPEG4…]和[ISO-IEC-14496-2_2001_MPEG4_Visual],MPEG4视频采用MP4V-ES方式。 MPEG4编码的主要概念是对象(Object)和背景,还有VS、VO、VOL、VOP、GOP等。 使用RTP推送MPEG4视频主要考虑两个关键点: 1、参数: profile_level_id: 000001B0F3,其中F3就是profile_level_id,它紧跟在VS起始码之后 config: 000001B6(VOP)之前的数值的16进制表示。 2、RTP封包: 直接封包:MPEG4直接封包
49、 分片:MPEG4可以直接分片,防止包丢失可以copy Vop头。 3.2.2.1 推送过程 [2010-5-7 10:22:13:625] ANNOUNCE rtsp://202.102.126.10/0123456789ABCDEF.sdp RTSP/1.0 CSeq:3452816846 Content-Type:application/sdp Content-Length:351 v=0 o=streamsender 0 0 IN IP4 0.0.0.0 c=IN IP4 202.102.126.10 a=tool:sdr v2.4a6 m=video 554
50、 RTP/AVP 96 a=control:trackID=0 a=rtpmap:96 MP4V-ES/90000 a=fmtp:96 profile-level-id=224;config=000001B0F4000001B50900000100000001200086C400670C161048518F000001B2587669443030 a=mpeg4-esid:201 a=Width:integer;352 a=Height:integer;288 a=framerate:25 [2010-5-7 10:22:13:656] RTSP/1.0 200 OK






