下面以“大牛直播SDK 的 RTSP 播放器遇到 RTP 不带 Marker 位(M bit)”为切入点,结合 RTP/RTCP 基础 与 H.264/H.265/AAC 的负载规范,说明发送端如何规范打包 一、先厘清 Marker 位在各规范里的语义 RTP 基础(RFC 3550):M 位的语义由具体负载格式定义,常用于标记“重要边界事件”(如视频帧边界或音频语音突发边界)。 序号:RTP 序号每包 +1,随机起始。 Marker:仅在“该 AU 的最后一包”置 1;否则为 0。 四、接收端(播放器)如何“稳健容错”:Marker 缺失时的切帧策略即使对端未设置 M 位,播放器也应能“稳健切帧”而不积压卡顿: 按 (SSRC, RTP 时间戳) 聚帧 同一 AU 的所有包时间戳相同 结合负载内信号 FU 分片的 E 标志 只标识“NALU 结束”,并不等同于“AU 结束”; 若存在 AUD NALU(H.264 type 9 / HEVC type 通常 35),可将其作为 AU
RTSP被用于建立的控制媒体流的传输,它为多媒体服务扮演“网络远程控制”的角色。尽管有时可以把RTSP控制信息和媒体数据流交织在一起传送,但一般情况RTSP本身并不用于转送媒体流数据。 媒体数据的传送可通过RTP/RTCP等协议来完成。 一次基本的RTSP操作过程是:首先,客户端连接到流服务器并发送一个RTSP描述命令(DESCRIBE)。 客户端再分析该SDP描述,并为会话中的每一个流发送一个RTSP建立命令(SETUP),RTSP建立命令告诉服务器客户端用于接收媒体数据的端口。 流媒体连接建立完成后,客户端发送一个播放命令(PLAY),服务器就开始在UDP上传送媒体流(RTP包)到客户端。 在播放过程中客户端还可以向服务器发送命令来控制快进、快退和暂停等。 第五步: 数据传送播放中 S->C:发送流媒体数据 // 通过RTP协议传送数据 6.
关键点: 该功能实现,主要需要考虑RTSP取摄像头视频流,拆RTP包,组H264帧,通过PJSIP的视频通道转发;这个过程中,涉及到RTP通道保活,RTSP通道保活;调试时间多耗费在对摄像头返回的RTP == 0){ printf_data(data, 7); printf("[1]seq:%d, old_type:%d, nalu_type:%d marker:%d, len:%d,last_len :%d\r\n", seq,old_type, nalu_type, marker, len, last_rtp_frame_cache_len); } if (nalu_type == 28) { :%d, data:%02x, nalu_type:%d marker:%d, len:%d,last_len:%d\r\n", seq,data[0], nalu_type, marker, len, ), payload, len); last_rtp_frame_cache_len += len; } } if (marker){ //reset 0 if (getFrameCallback
前面我们花了较多的篇幅来介绍了RTSP协议的一些细节,但是rtsp传输,本质上涉及三种协议,RTSP、RTP以及RTCP。RTSP主要负责连接建立,销毁及一些其他的控制。 而实际涉及媒体数据传输使用的是RTP协议,本节我们来介绍一下RTP协议。 RTP概览 RTP是一种应用层协议,传输层协议可以是TCP或者UDP(UDP多一些)! RTP数据包由两部分组成,一部分是RTP Heaeder,一部分是RTP body,RTP Header占用最少12个字节,最多72个字节;另一部分是RTP Payload,用来封装实际的数据负载,如封装 GB28181中对PT的定义 负载类型 编码名称 时钟频率 通道数 SDD描述中m字段的media项 4 G.723 8k HZ 1 audio 8 PCMA(G.711 A) 8k HZ 1 audio 9 M(marker) ? 值为0,表示该数据包非一帧数据的最后一帧!wireshark的解析: ? ps:当该值为1时,表示该数据包是一帧数据的最后一个数据包!
RTP协议详细说明了在互联网上传递音频和视频的标准数据包格式。它一开始被设计为一个多播协议,但后来被用在很多单播应用中。RTP协议常用于流媒体系统(配合RTCP协议或者RTSP协议)。 P:填充标志,占1位,如果P=1,则在该报文的尾部填充一个或多个额外的八位组,它们不是有效载荷的一部分。 3. X:扩展标志,占1位,如果X=1,则在RTP报头后跟有一个扩展报头。 4. 其控制流由RTSP协议来提供。 RTP协议的使用: RTP的使用实例之一如上图: 上面是某省IPTV2.0早期的一个数据包的情况。从包中可以看出RTP是怎么和RTSP配合一起使用的。 从包402到411为RTSP的协商过程,RTSP在PLAYer命令后数据包就到来。紧跟其后412包就是一个mpeg 的PES包,它是有由rtp来承载的TS来形成。 下图为420包的展开图: 从中可以看出承载RTP的为UDP的数据流这个包中有x标志位为1则说明其有 header extensions.其header extensions为最下面。
特点:RTSP协议本身不传输媒体数据,而是通过控制连接建立命令和控制,媒体数据通过其他协议(如RTP)传输。它提供了丰富的控制选项,方便用户操作,且可以穿越NAT和防火墙。应用场景:1. RTP(Real-time Transport Protocol)简介:RTP是一个实时传输媒体数据的协议,通常与RTSP一起使用。它负责在网络上传输音视频数据。 直播服务 应用场景:在直播场景中,RTP协议为高质量的音视频传输提供了保障,RTP能确保观众能够实时观看到流畅、清晰的视频内容。 总结RTMP、RTSP、RTP、HLS、DASH这些协议在流媒体传输领域各有特点,但也有一些共同点。分别在实时视频传输中各有优势,选择哪种协议取决于具体的应用场景、网络条件以及设备兼容性等因素。 RTMP、RTSP、RTP、HLS、DASH这些协议在服务于流媒体传输方面有着共同的目标和追求,同时也在各自擅长的领域发挥着重要作用。
RTCP协议介绍见:音视频协议-RTCP协议介绍 2 协议格式介绍 rtp协议定义在rfc3550第5.1章RTP头定义: 版本号(2bit):默认为2; 填充标志(1bit):当设置为1时 ,最后一个字节表示填充字节数包括该字节本身,这些填充不属于荷载,解析时需要被忽略; 扩展标志(1bit):当设置为1时,rtp头后面会接一个扩展头需要解析,需要注意的是length长度是32bit为单位计算的 ,也就是4字节加1; CSRC计数(4bit):CSRC 个数最多就是15个; 标志位M(1bit):视频编码表示一帧的结束标志; 荷载类型(7bit):具体见RFC3551,0-95已经被定义 _t extension:1;//扩展 uint8_t csrccount:4;//csrc count uint8_t marker:1; //标志 uint8_t payloadtype identifier marker = (rtpheader->marker == 0)?
上一篇我们讲了RTSP PAUSE消息,本篇我们来看下RTSP TEARDOWN消息! TEARDOWN作用 TEARDOWN是拆卸的意思,对于RTSP而言,就是结束流传输,同时释放与之相关的资源,TEARDWON之后,整个RTSP连接也就结束了! ID(SETUP消息请求之后RTSP sever返回的会话id)。 回复消息中包含RTSP 版本号,状态码以及针对状态码的描述;同时返回消息的序列号(对应请求序列号)以及session id;另外还返回日期信息!服务端正常返回该消息,则此次RTSP连接消息结束! ", realm="bcad28138995", nonce="a1a5b9d3865180dccbaffb1cb2eb2a27", uri="rtsp://192.17.1.73:554/Streaming
RTP是一种应用层协议,一般使用 UDP作为底层协议实现数据传输,但并不强制底层协议的选择,比如利用 RTSP进行流媒体传输时使用 TCP也非常常见。 P:padding,1 bit, 填充标志。如果 P=1,则在该报文的尾部填充一个或多个额外的填充数据,它们不算作负载的一部分。填充的最后一个字节指明可以忽略多少个填充比特。 填充可能用于某些具有固定长度的加密算法,或者用于在底层数据单元中传输多个RTP包。 X:extension,1 bit,扩展标志。如果 X=1,则在 RTP 报头后将有且仅有一个扩展报头。 在接收端,主编码与所有次编码作为独立的 RTP 包提取出来,复制冗余编码包的 RTP 头中的 sequence number,SSRC,marker bit,CC field,RTP version,和 使用冗余编码的荷载格式,有可能不能正确恢复出 marker bit。在使用 RFC 2198 来进行 FEC 封装的应用程序中,必须把恢复出的媒体数据包的 marker bit 设置为零。
01 GB28181中的RTP over TCP GB28181的TCP码流遵循的标准是RFC4571(RTP OVER TCP),具体类型是: 0 1 2 3 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 ------- )-and-RTP-Control-Protocol-(RTCP)-Packets-over-Conn.pdf》文档 02 RTSP中的RTP over TCP RTSP中tcp码流是遵循的RFC2326 data :数据 - ,比如说RTP包,总长度与上面的数据长度相同 RTP,RTCP数据和RTSP数据共享TCP数据通道,所以必须有一个标识来区别三种数据: RTP和RTCP数据会以$符号+1个字节的通道编号 +2个字节的数据长度,共4个字节的前缀开始, RTSP数据是没有前缀数据的。
RTSP负责定义具体的控制信息、操作方法、状态码,以及描述与RTP之间的交互操作。RTSP媒体服务协议框架如下: ? )", nonce="6b9a455aec675b8db81a9ceb802e4eb8", uri="rtsp://10.3.8.202:554", response="3fc4b15d7a923fc36f32897e3cee69aa (10789)", nonce="6b9a455aec675b8db81a9ceb802e4eb8", uri="rtsp://10.3.8.202:554/", response="ddfbf3e268ae954979407369a104a620 nonce="6b9a455aec675b8db81a9ceb802e4eb8", uri="rtsp://10.3.8.202:554/", response="b5abf0b230de4b49d6c6d42569f88e91 ="admin", realm="IP Camera(10789)", nonce="6b9a455aec675b8db81a9ceb802e4eb8", uri="rtsp://10.3.8.202:
3、RTSP和RTP(TRCP)的联系 RTP:Realtime Transport Protocol实时传输协议。RTP提供时间标志,序列号以及其他能够保证在实时数据传输时处理时间的方法。 RCTP是RTP的控制部分,用来保证服务质量和成员管理。RTP和RTCP是一起使用的。 RTSP:Realtime Streaming Protocol 实时流传输协议。 RTSP具体数据传输交割RTP,提供对流的控制。 RTP是基于UDP协议的,UDP不用建立连接,效率更高。但允许丢包,这就要求在重新组装媒体的时候多做一些工作。 应用程序对应的是play,seek,pause,stop等命令,RTSP则是处理这些命令,在UDP传输时使用RTP(RTCP)来完成。如果是TCP连接则不会使用RTP(RTCP)。 AzcAAB8ELyARAbd0AAST4AAEk+AFIAAAAbDzAAABtQ7gQMDPAAABAAAAASAAhED6KFAg8KIfBgEC" a=StreamName:string;"Video Track" 9、
此版本号固定为2 rtp_hdr->marker = 0; //标志位,由详细协议规定其值。 rtp_hdr->marker=1; rtp_hdr->seq_no = htons(seq_num ++); //序列号,每发送一个RTP包增1 //设置NALU HEADER,并将这个HEADER // 设置rtp M 位;当前传输的是最后一个分片时该位置1 rtp_hdr->marker=1; //设置FU INDICATOR,并将这个HEADER填入sendbuf[12 (1400) //设置rtp M 位; rtp_hdr->marker=0; //设置FU INDICATOR,并将这个HEADER填入sendbuf[12] 2; //版本号号,此版本号固定为2 rtp_hdr->marker = 1; //标志位,由详细协议规定其值。
协议介绍 SDP 完全是一种会话描述格式(对应的RFC2327) ― 它不属于传输协议 ― 它只使用不同的适当的传输协议,包括会话通知协议(SAP)、会话初始协议(SIP)、实时流协议(RTSP 媒体协商这一块要用RTSP来实现. 流媒体协议sdp信息,附带在describe报文中有rtsp服务端发出,主要目的,告之会话的存在和给出参与该会话所必须的信息,sdp会话完全是文本形式,采用UTF-8编码的ISO 10646字符集 sdp 会话描叙格式介绍 名称 格式: 说明 协议版本: v=0 给出sdp的版本号,目前为0版本,无子版本号 会话源 o=(用户名)(会话标识)(版本)(网络类型)(地址类型)(地址) 如果不存在用户登录名,该字段标志位 /udp上传送(RTP/AVP)IETF RTP协议,在udp上传输 格式列表: 对应对应的音频负载类型(PT) m=video 0 RTP/AVP 96 a描叙行: 格式:a=rtpmap:(净荷类型
从协议演化看,RTSP(控制)、RTP(承载)、RTCP(反馈)组成了“控制—数据—反馈”的最小闭环:SDP 对编解码与时间基进行约束;SETUP/PLAY 决定传输形态(RTP/UDP、RTP/TCP 如果说 RTP 负责“送数据”,RTSP 则负责“告诉系统什么时候、以何种方式去送”。 1.3 RTSP 与 RTP / RTCP 的协同关系RTSP 本身并不携带音视频内容。它的职责是会话建立 + 参数协商 + 状态管理,而数据面完全交给 RTP 与 RTCP。 SSRC = 0x7A9C22 Payload Type = 96 (H.264) RTCP Sender Report 示例 NTP Timestamp = 0xE44123C9B6000000 五、落地示例:SmartMediaKit 的 RTSP 播放模块在前文我们系统地分析了 RTSP/RTP/RTCP 三层协议的机制与关键工程挑战。
RTSP URI表明请求的RTSP 地址; RTSP version表明版本号; CSeq 表示请求的序列号; User-Agent表示用户代理; Session 表示会话id,值为SETUP请求之后, 表示会话ID,SETUP返回时确定的ID; RTP-Info表示RT; Date表示日期; 我们来看一个抓包文件 ? CSeq,Session, Date就不多介绍了,主要看下RTP-info: 第一个url表示视频播放的地址,第一个seq表示第一个rtp视频数据包开始的序列号,第一个rtptime表示视频开始播放的时间戳 ://192.17.1.63:554/", response="9ea6c2659d3bce8d129ca3549ecc7fbf"\r\n\r\n RTSP PLAY (response) RTSP/1.0 200 OK\r\n CSeq: 6\r\n Session: 337474243\r\n RTP-Info: url=rtsp://192.17.1.63:554/trackID=1;seq=3658
针对音视频数据量大的特点,有一套专门的网络传输协议RTP/RTSP,它的运行流程是这样的: RTSP RTSP(Real Time Streaming Protocol)是一款网络控制协议,用来控制流媒体服务器的 当PLAY命令发送后,就进入了第三部分RTP协议传输的流媒体数据包。 NSString *_rtspAddress; // 服务端返回数据 NSString *_sessionId; NSString *_cliendPort; //RTP 96 H264/90000 a=fmtp:96 packetization-mode=1;profile-level-id=4D001E;sprop-parameter-sets=Z00AHpWoLQ9oQAAA +gAAHUwB,aO48gA== a=control:track1 m=audio 0 RTP/AVP 0 c=IN IP4 0.0.0.0 b=AS:64 a=rtpmap:0 PCMU/8000
)+ W3C WebRTC部分(Opus/VP8/VP9/H264)✔(P2P信令+ICE)RTSP控制层流媒体协议IETF RFC 2326 / 7826由 RTP 承载决定✔(SETUP/PLAY/ 5.2 RTP 规范族:RTSP 的媒体核心基础RTSP 本身不携带媒体,它只是“指挥官”,真正负责音视频数据传输的是 RTP 与 RTCP。 ③ 音频 Payload 规范 AAC RTP Payload(RFC 3640) G.711 / G.726(各自的 RTP Payload 定义) RTP Payload 规范族使得 RTSP 可以承载各种不同的媒体编码格式 ③ 媒体灵活性极高RTSP 可以传输: H.264 H.265 MJPEG AAC G.711 甚至 raw 视频格式 不像 WebRTC 只能传 VP8/VP9/H.264,灵活性远高于浏览器体系 一句话总结: RTSP = 控制层(RTSP) + 媒体层(RTP/RTCP) 它是过去 25 年摄像头行业的事实标准,也是未来 AI 视觉时代最稳定的底层视频协议。
[1620880333273-%E7%BD%91%E7%BB%9C%E6%8A%80%E6%9C%AF%E8%81%94%E7%9B%9F%E7%AB%99.jpg] 大家好,今天给大家带来的是IPTV 是工作在RTP之上的应用层协议。它的主要目标是为单播和多播提供可靠的播放性能。RTSP的主要思想是提供控制多种应用数据传送的功能。 即提供一种选择传送通道的方法,例如UDP、TCP、IP多播,同时提供基于RTP传送机制的方法。RTSP控制通过单独协议发送的流,与控制通道无关,例如,RTSP控制可通过TCP连接,而数据流通过UDP。 另外,由于RTSP在语法和操作上与HTTP类似,RTSP请求可由标准HTTP或MIME解析器解析,并且RTSP请求可被代理、通道与缓存处理。 与HTTP相比,RTSP是双向的,即客户机和服务器都可以发出RTSP请求。 实现RTSP的系统必须支持通过TCP传输RTSP,并支持UDP。
但是我们如果在TCP传输协议上承载RTSP/RTP将解决这些问题。 1. RTSP/RTP的控制命令和数据都通过一个端口,即RTSP的端口(默认为554),进行交互。 2. 但是,使用TCP传输协议承载RTSP/RTP需要花更多的功夫。 1. 由于二元交织,会使得RTP包封包和解包的过程变得更加复杂。 2. 接下来让我们来了解一下怎么使用TCP承载RTSP/RTP。 TCP承载RTSP/RTP 当使用TCP协议承载RTSP/RTP时,所有的命令和媒体数据都将通过RTSP端口,通常是554,进行发送。 接下来我们将描述使用TCP承载RTSP/RTP的主要要素: SETUP 要使用TCP连接,RTSP客户端需要在SETUP阶段请求TCP连接。 下面是一个rtsp客户端请求 通过rtp over tcp方式建立连接报文; SETUP之后,RTP数据将通过用来发送RTSP命令的TCP Socket进行发送。