下面以“大牛直播SDK 的 RTSP 播放器遇到 RTP 不带 Marker 位(M bit)”为切入点,结合 RTP/RTCP 基础 与 H.264/H.265/AAC 的负载规范,说明发送端如何规范打包 一、先厘清 Marker 位在各规范里的语义 RTP 基础(RFC 3550):M 位的语义由具体负载格式定义,常用于标记“重要边界事件”(如视频帧边界或音频语音突发边界)。 序号:RTP 序号每包 +1,随机起始。 Marker:仅在“该 AU 的最后一包”置 1;否则为 0。 5) MTU 与分片尺寸建议 典型 UDP MTU 1500,预留:IP(20/40) + UDP(8) + RTP(12) + 负载头(H.264 FU 2B / HEVC FU 3B 左右),保守 结合负载内信号 FU 分片的 E 标志 只标识“NALU 结束”,并不等同于“AU 结束”; 若存在 AUD NALU(H.264 type 9 / HEVC type 通常 35),可将其作为 AU
RTSP被用于建立的控制媒体流的传输,它为多媒体服务扮演“网络远程控制”的角色。尽管有时可以把RTSP控制信息和媒体数据流交织在一起传送,但一般情况RTSP本身并不用于转送媒体流数据。 媒体数据的传送可通过RTP/RTCP等协议来完成。 一次基本的RTSP操作过程是:首先,客户端连接到流服务器并发送一个RTSP描述命令(DESCRIBE)。 SETUP 主要功能: 与服务器协商流媒体传输方式 此过程中,建立 RTP 通道 关键字段: Transport—— 传输方式 Transport: MP2T/RTP/ UDP;unicast 第三步:建立RTSP会话 3.C->S:SETUP request //通过Transport头字段列出可接受的传输选项,请求S建立会话 3.S->C:SETUP response 第五步: 数据传送播放中 S->C:发送流媒体数据 // 通过RTP协议传送数据 6.
关键点: 该功能实现,主要需要考虑RTSP取摄像头视频流,拆RTP包,组H264帧,通过PJSIP的视频通道转发;这个过程中,涉及到RTP通道保活,RTSP通道保活;调试时间多耗费在对摄像头返回的RTP :%d\r\n", seq,old_type, nalu_type, marker, len, last_rtp_frame_cache_len); } if (nalu_type == 28) { nalu_type:%d marker:%d, len:%d,last_len:%d\r\n", seq,data[0], nalu_type, marker, len, last_rtp_frame_cache_len += len; } } if (marker){ //reset 0 if (getFrameCallback ! } } 3、开放的接口; rtsp_client部分的接口, typedef struct pjmedia_rtsp_source_op { int (*init_rtsp_client)
前面我们花了较多的篇幅来介绍了RTSP协议的一些细节,但是rtsp传输,本质上涉及三种协议,RTSP、RTP以及RTCP。RTSP主要负责连接建立,销毁及一些其他的控制。 而实际涉及媒体数据传输使用的是RTP协议,本节我们来介绍一下RTP协议。 RTP概览 RTP是一种应用层协议,传输层协议可以是TCP或者UDP(UDP多一些)! RTP数据包由两部分组成,一部分是RTP Heaeder,一部分是RTP body,RTP Header占用最少12个字节,最多72个字节;另一部分是RTP Payload,用来封装实际的数据负载,如封装 RTP Header格式 0 1 2 3 4 +-+-+-+-+-+ M(marker) ? 值为0,表示该数据包非一帧数据的最后一帧!wireshark的解析: ? ps:当该值为1时,表示该数据包是一帧数据的最后一个数据包!
RTP协议详细说明了在互联网上传递音频和视频的标准数据包格式。它一开始被设计为一个多播协议,但后来被用在很多单播应用中。RTP协议常用于流媒体系统(配合RTCP协议或者RTSP协议)。 P:填充标志,占1位,如果P=1,则在该报文的尾部填充一个或多个额外的八位组,它们不是有效载荷的一部分。 3. X:扩展标志,占1位,如果X=1,则在RTP报头后跟有一个扩展报头。 4. 如果扩展标志被置位则说明紧跟在报头后面是一个头扩展,其格式如下: 0 1 2 3 其控制流由RTSP协议来提供。 RTP协议的使用: RTP的使用实例之一如上图: 上面是某省IPTV2.0早期的一个数据包的情况。从包中可以看出RTP是怎么和RTSP配合一起使用的。 从包402到411为RTSP的协商过程,RTSP在PLAYer命令后数据包就到来。紧跟其后412包就是一个mpeg 的PES包,它是有由rtp来承载的TS来形成。
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已经被定义 3 协议解析 这里选用目前业界比较认可的JRTPLIB库进行讲解。 3.1 协议头定义 结构体设计需要考虑设备的大小端问题,大端和小的差别主要是单个字节的内部顺序,大端与协议顺序一致,小端则是相反的。 _t extension:1;//扩展 uint8_t csrccount:4;//csrc count uint8_t marker:1; //标志 uint8_t payloadtype
优势:RTSP的低延迟特性保证了视频会议的流畅性,同时其可扩展性和灵活性也支持了大规模会议的需求。 3. 直播与点播服务 应用场景:RTSP广泛应用于直播和点播服务中。 优势:RTSP的低延迟和实时控制功能保证了虚拟现实和增强现实应用的流畅性和互动性,提升了用户体验。 3. RTP(Real-time Transport Protocol)简介:RTP是一个实时传输媒体数据的协议,通常与RTSP一起使用。它负责在网络上传输音视频数据。 3. 流媒体服务 应用场景:流媒体服务如在线视频点播、网络电视等也广泛采用RTP协议。它允许用户随时随地访问和播放音视频内容,而无需等待整个文件下载完成。 3. 支持多种传输层协议 底层协议兼容性:这些协议通常可以基于TCP或UDP等传输层协议进行数据传输。
此版本号固定为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 2; //版本号号,此版本号固定为2 rtp_hdr->marker = 1; //标志位,由详细协议规定其值。 :1; /* 标志1位 */ /* bytes 2, 3 */ unsigned short seq_no; /* bytes 4-7 */ unsigned
协议介绍 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:(净荷类型
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)。 SETUP 客户端提醒服务器建立会话,并确定传输模式: SETUP rtsp://192.168.20.136:5000/xxx666/trackID=0 RTSP/1.0 CSeq: 3 Transport
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 设置为零。
寻找 marker 基因 来给每个细胞簇里差异表达明显的基因排个序。通常情况下,要是 AnnData的 .raw 属性已经提前设置好了,就会拿它来用。最便捷快速的方式就是做** t 检验**。 marker_genes = [ *["IL7R", "CD79A", "MS4A1", "CD8A", "CD8B", "LYZ", "CD14"], *["LGALS3", "S100A8 ", "GNLY", "NKG7", "KLRB1"], *["FCGR3A", "MS4A7", "FCER1A", "CST3", "PPBP"], ] 把之前保存有 Wilcoxon 秩和检验结果的那个对象重新加载进来 sc.pl.violin(adata, ["CST3", "NKG7", "PPBP"], groupby="leiden") 给细胞类型做上标记。 , groupby="leiden"); 还有一种很简洁的小提琴图: sc.pl.stacked_violin(adata, marker_genes, groupby="leiden"); 在这个分析过程中
UDP协议上的RTSP/RTP需要打开许多UDP端口(每一路流媒体都需要2个UDP端口,一个用于接收数据,一个用于接收控制信息); 2.当因特网上的路由器没有打开这些端口的时候,第一点将会存在问题; 3 3. TCP包更容易穿透中间网络路由器。 但是,使用TCP传输协议承载RTSP/RTP需要花更多的功夫。 1. 由于二元交织,会使得RTP包封包和解包的过程变得更加复杂。 2. 接下来让我们来了解一下怎么使用TCP承载RTSP/RTP。 TCP承载RTSP/RTP 当使用TCP协议承载RTSP/RTP时,所有的命令和媒体数据都将通过RTSP端口,通常是554,进行发送。 DESCRIBE rtsp://222.201.145.236/slamtv60.264 RTSP/1.0 CSeq: 3 User-Agent: LibVLC/1.1.11 (LIVE555 Streaming RTSP/1.0 200 OK CSeq: 3 Date: Wed, Mar 07 2012 03:48:07 GMT Content-Base: rtsp://222.201.145.236/slamtv60.264
long var1, String var3)Ack 确认回调,返回相关参数ntsOnPlaybackMANSRTSPPlayCommand(long var1, String var3)回放 RTSP (long var1, String var3, double var4)回放 RTSP 缩放命令回调,返回相关参数ntsOnPlaybackMANSRTSPSeekCommand(long var1, String var3, double var4)回放 RTSP 定位命令回调,返回相关参数ntsOnPlaybackMANSRTSPTeardownCommand(long var1, String var3)回放 RTSP 拆卸命令回调,返回相关参数ntsOnByePlayback(long var1, String var3)Bye 请求回调,返回相关参数ntsOnTerminatePlayback rtp_sender_handle, int is_enable)启用或禁用 RTP 发送器接收功能,参数为发送器句柄和是否启用标志public native int SetRTPSenderReceiveSSRC
二、TCP模式:数据与控制复用在 TCP 模式下(即 RTP over RTSP/TCP 或者 interleaved 模式): 视频/音频数据直接通过已有的 RTSP TCP 连接传输; 不需要额外开辟 情况对比 视频 + 音频:1 TCP(控制)+ 4 UDP(RTP/RTCP ×2)= 5 个端口 只有视频:1 TCP(控制)+ 2 UDP(RTP/RTCP ×1)= 3 个端口 特点 优点:丢包时只影响个别 /RTCP)5实时性要求高、带宽充足UDP模式(仅视频)1 个 TCP (554)2 个 UDP (RTP/RTCP)3监控摄像头单视频流五、实践建议 防火墙/NAT 复杂网络:建议优先选择 TCP模式 例如,NVR/DVR 系统在大规模接入摄像头时,应合理分配 RTP 端口池。 六、结论一路 RTSP 流的端口占用,取决于传输模式: TCP 模式:仅需 1 个端口(RTSP TCP 通道)。 UDP 模式:通常需要 3~5 个端口(RTSP 控制 + RTP/RTCP 对)。 理解这一点,不仅能帮助开发者合理配置端口和防火墙策略,也能在系统架构设计中更好地平衡 实时性 与 可部署性。
SETUP表明消息类型; URI表示请求的RTSP服务器的地址; RTSP_VER表明RTSP的版本; TRANSPORT表明媒体流的传输方式,具体包括传输协议如RTP/UDP;指出是单播,组播还是广播 请求之后,如果没有异常情况,RTSP服务器的回复比较简单,回复200 OK消息,同时在Transport字段中增加sever_port,指明对等的服务端RTP和RTCP传输的端口,增加ssrc字段,增加 通过该抓包文件,我们可以看出,服务端对应SETUP请求的RTP和RTCP的传输端口分别为8284和8285;ssrc的值为4a7fb757;mode="play"表示当前rtsp连接是播放模式! : Digest username="admin", realm="IP Camera(23306)", nonce="a946c352dd3ad04cf9830d5e72ffb11e", uri="rtsp 往期推荐 手撕RTSP协议系列(1)——Rtsp基本流程 手撕RTSP协议系列(2)——Rtsp消息格式 手撕RTSP协议系列(3)——sdp格式详解 手撕RTSP协议系列(4)——OPTION 手撕RTSP
://192.168.99.162:5544/live/YKiavBi7g RTSP/1.0 CSeq: 3 User-Agent: LibVLC/3.0.12 (LIVE555 Streaming Media v2016.11.28) Accept: application/sdp RTSP/1.0 200 OK CSeq: 3 Date: Thu, 15 Jul 2021 10:34:36 CST Content-Type : 473 v=0 o=- 0 0 IN IP4 127.0.0.1 s=No Name c=IN IP4 127.0.0.1 t=0 0 a=tool:lal 0.22.0 m=video 0 RTP =1;mode=AAC-hbr;sizelength=13;indexlength=3;indexdeltalength=3; config=1190 a=control:streamid=1 三、获取传输端口及通道 0 RTSP/1.0 CSeq: 4 User-Agent: LibVLC/3.0.12 (LIVE555 Streaming Media v2016.11.28) Transport: RTP/AVP
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推送相关的资料和测试软件比较少,本文介绍rtsp推送相关信令和测试效果: 1. rtsp推送流程. 主要分两部分:第一部分先发送信令;第二部分发送rtp包。 indexdeltalength=3; config=1208 a=control:streamid=1 h265(hevc) + aac ANNOUNCE: ANNOUNCE rtsp://192.168.0.174 :554/live3.sdp RTSP/1.0 Content-Type: application/sdp CSeq: 2 User-Agent: mmmmd Content-Length: 364 v 按上图配置好后,点击 "推送rtsp"按钮后会看到相应的播放地址: 3. 拷贝播放器地址,然后打开 SmartPlayer.exe, 进行播放即可: 4. 小结: rtsp相对于rtmp推送的优势是可以用udp传输音视频数据,udp传输可以避免延时累积,当然rtsp也可以用tcp传输rtp包, 上面的推送程序upd和tcp传输都支持。
RTSP并不包括具体数据的传输,该功能一般由RTP与RTCP协议来实现,并可以通过TCP或UDP两种底层传输方式进行。 之前说过,流媒体数据传输不是RTSP协议的内容,由RTP包来做。但是具体在实现上,RTP包可以通过UDP或TCP的方式来进行,而且这两种传输方式,区别其实还不小,下面具体说下。 RTSP over UDP 对于udp模式,客户端在发送PLAY以后,就开始建立udp端口,以接收服务器发来的RTP包,同样,服务器也会建立udp端口,并向客户端发送RTP包。 = "Base64(sps)" + "," + "Base64(pps)" 3. 主要代码 3.1 Rtsp服务接口 ? 3.2 RtspSession在TCP通道里处理RTSP消息与RTP报文 ? 4.