下面以“大牛直播SDK 的 RTSP 播放器遇到 RTP 不带 Marker 位(M bit)”为切入点,结合 RTP/RTCP 基础 与 H.264/H.265/AAC 的负载规范,说明发送端如何规范打包 一、先厘清 Marker 位在各规范里的语义 RTP 基础(RFC 3550):M 位的语义由具体负载格式定义,常用于标记“重要边界事件”(如视频帧边界或音频语音突发边界)。 序号:RTP 序号每包 +1,随机起始。 Marker:仅在“该 AU 的最后一包”置 1;否则为 0。 2) 单 NALU 包(Single NAL Unit) NALU 尺寸 ≤ MTU - IP/UDP/RTP - 负载头 时,整 NALU 进一包; 若该 NALU 是 AU 内的最后一个 NALU 5) MTU 与分片尺寸建议 典型 UDP MTU 1500,预留:IP(20/40) + UDP(8) + RTP(12) + 负载头(H.264 FU 2B / HEVC FU 3B 左右),保守
媒体数据的传送可通过RTP/RTCP等协议来完成。 一次基本的RTSP操作过程是:首先,客户端连接到流服务器并发送一个RTSP描述命令(DESCRIBE)。 通道 关键字段: Transport—— 传输方式 Transport: MP2T/RTP/ UDP;unicast;destination =121.60.21.53;client_port =8342-8343,MP2T/RTP/ TCP;unicast;destination =121.60.21.53;interleaved=0-1 4、PLAY 主要功能: 与服务器协商流媒体播放 2. 第二步:得到媒体描述信息 2.C->S:DESCRIBE request //要求得到S提供的媒体描述信息 2.S->C:DESCRIBE response //S回应媒体描述信息,
2、RTSP的媒体通道RTP/RTCP; 动态获取RTP/RTCP端口: typedef struct { int sock; int port; struct sockaddr_in , last_rtp_frame_cache_len); } len -= 2; payload += 2; printf("nalu_type:%2x,start:%d, end: ; } else { int pps_pos = 0; printf("[2]seq:%d, data:%02x, nalu_type:%d marker:%d, len:%d,last_len payload += rtsp_server_pps_len + rtsp_server_sps_len; printf("[2]reserved_len:%2x, \r\n"); + rtsp_server_sps_len; printf("[2]reserved_len:%2x, \r\n"); memcpy((void *)(rtp_frame_cache
前面我们花了较多的篇幅来介绍了RTSP协议的一些细节,但是rtsp传输,本质上涉及三种协议,RTSP、RTP以及RTCP。RTSP主要负责连接建立,销毁及一些其他的控制。 RTP Header格式 0 1 2 3 4 +-+-+-+-+-+ 值为10,版本号为2,我们与wireshark的抓包解析对比一下: ? Padding ? 值为0,表示不填充。wireshark的抓包如下: ? X(扩展) ? 值为0。 M(marker) ? 值为0,表示该数据包非一帧数据的最后一帧!wireshark的解析: ? ps:当该值为1时,表示该数据包是一帧数据的最后一个数据包! 同步信源标识符,此数据包的值为0x6b 2f dd 87,wireshark的解析为: ?
如前所述,RTP也可以是数组。我们看一下数组为RTP的一个例子。如下图所示,HLS Kernel random_noise产生输入数据传递给AIE Kernel fir24_sym。 fir24_sym是一个滤波器,滤波器系数作为输入参数由PS传递,其输出经HLS Kernel s2mm写入到外部存储器。
RTP协议详细说明了在互联网上传递音频和视频的标准数据包格式。它一开始被设计为一个多播协议,但后来被用在很多单播应用中。RTP协议常用于流媒体系统(配合RTCP协议或者RTSP协议)。 RTP报头格式如图6.7所示,其中: 1.V:RTP协议的版本号,占2位,当前协议版本号为2。 2. 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来形成。
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)?
2. RTSP(Real Time Streaming Protocol)简介:RTSP是一种网络流媒体协议,用于控制流媒体数据的传输和播放。 优势:RTSP提供了实时控制功能,允许用户通过发送控制指令(如播放、暂停、快进、快退等)来操作视频流,增强了视频监控的灵活性和实用性。 2. RTP(Real-time Transport Protocol)简介:RTP是一个实时传输媒体数据的协议,通常与RTSP一起使用。它负责在网络上传输音视频数据。 优势:RTP的高实时性和精确的时间戳机制,使得音视频数据在传输过程中能够保持低延迟和同步性,从而提高了会议的质量和效率。 2. 2. 适应多种网络环境 网络适应性:这些协议都设计有在网络条件变化时保持传输稳定性和连续性的机制。
上一篇我们简单介绍了rtsp协议,本篇我们来看一下rtsp的消息结构! RTSP消息分为两大类,一类是请求消息(request),一类是回应消息(ressponse)! 说明: 请求消息由方法+URI+RTSP版本开头,之后跟一条或多条消息! URI:表示接收方的地址,如rtsp://192.168.1.201:554 CR:表示回车 LF:表示换行 RTSP使用消息类型和消息体来表示不同类型的消息。 最后一条消息要使用两个CR LF。 如图中所示,该RTSP请求消息的方法为OPTIONS,请求的目标地址为rtsp://192.17.1.63:554,RTSP的版本为1.0; 接下来包含两种类型的消息,第一种为CSeq表示序列号,本次请求的序列号为 我们接下来看一下回应消息的格式: 2 回应消息(response) ? 回应消息由RTSP版本+状态码+解释开头,之后跟一条或多条消息!
此版本号固定为2 rtp_hdr->marker = 0; //标志位,由详细协议规定其值。 rtp_hdr->marker=1; rtp_hdr->seq_no = htons(seq_num ++); //序列号,每发送一个RTP包增1 //设置NALU HEADER,并将这个HEADER 2; //版本号号,此版本号固定为2 rtp_hdr->marker = 1; //标志位,由详细协议规定其值。 /* 版本号2位 */ /* byte 1 */ unsigned char payload:7; /* 负载类型 */ unsigned char marker:1; / * 标志1位 */ /* bytes 2, 3 */ unsigned short seq_no; /* bytes 4-7 */ unsigned long
2、RTSP与HTTP的区别与联系 联系:两者都用纯文本来发送消息,且RTSP协议语法也和HTTP类似。RTSP一开始这样设计,也是为了能够兼容使用以前写的HTTP协议分析代码。 3、RTSP和RTP(TRCP)的联系 RTP:Realtime Transport Protocol实时传输协议。RTP提供时间标志,序列号以及其他能够保证在实时数据传输时处理时间的方法。 RCTP是RTP的控制部分,用来保证服务质量和成员管理。RTP和RTCP是一起使用的。 RTSP:Realtime Streaming Protocol 实时流传输协议。 RTSP具体数据传输交割RTP,提供对流的控制。 RTP是基于UDP协议的,UDP不用建立连接,效率更高。但允许丢包,这就要求在重新组装媒体的时候多做一些工作。 m=video 0 RTP/AVP 97 b=as:150 b=RR:11250 b=RS:3750 a=control:streamid=2 a=range:npt=0-72.080000 a=length
协议介绍 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:(净荷类型
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 设置为零。
UDP协议上的RTSP/RTP需要打开许多UDP端口(每一路流媒体都需要2个UDP端口,一个用于接收数据,一个用于接收控制信息); 2.当因特网上的路由器没有打开这些端口的时候,第一点将会存在问题; 3 但是我们如果在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,进行发送。 RTP和RTCP数据会以$符号+1个字节的通道编号+2个字节的数据长度,共4个字节的前缀开始,RTSP数据是没有前缀数据的。
如需集成语音广播、语音对讲功能,确保 SmartPlayerJniV2.java 放置于 com.daniulive.smartplayer 包名下(可在其他包名下调用)。 RTP 数据发送RTP Sender(SmartPublisherJniV2.java)相关接口设计如下:方法名描述public native long CreateRTPSender(int reserve rtp_sender_handle, int is_enable)启用或禁用 RTP 发送器接收功能,参数为发送器句柄和是否启用标志public native int SetRTPSenderReceiveSSRC public native int DestoryRTPSender(long rtp_sender_handle)销毁 RTP 发送器,参数为发送器句柄2. RTP 数据接收对应 RTP Receiver(SmartPlayerJniV2.java)相关接口设计如下(如无语音广播或语音对讲相关技术需求,这部分可忽略):方法名描述public native long
二、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 对)。 理解这一点,不仅能帮助开发者合理配置端口和防火墙策略,也能在系统架构设计中更好地平衡 实时性 与 可部署性。
CSeq: 2 User-Agent: LibVLC/3.0.12 (LIVE555 Streaming Media v2016.11.28) RTSP/1.0 200 OK Server: tsingsee0.23.0 CSeq: 2 Public:DESCRIBE, ANNOUNCE, SETUP, PLAY, PAUSE, RECORD, TEARDOWN 二、视频描述 以下代表为视频流,控制的streamid= 并且对应的类型为97: m=audio 0 RTP/AVP 97 b=AS:128 a=rtpmap:97 MPEG4-GENERIC/48000/2 a=fmtp:97 profile-level-id Streaming Media v2016.11.28) Transport: RTP/AVP;unicast;client_port=54374-54375 RTSP/1.0 200 OK CSeq ) Transport: RTP/AVP;unicast;client_port=54376-54377 Session: 191201771 RTSP/1.0 200 OK CSeq: 5 Date
数据,偶数端口用来接收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连接是播放模式! 往期推荐 手撕RTSP协议系列(1)——Rtsp基本流程 手撕RTSP协议系列(2)——Rtsp消息格式 手撕RTSP协议系列(3)——sdp格式详解 手撕RTSP协议系列(4)——OPTION 手撕RTSP
从协议演化看,RTSP(控制)、RTP(承载)、RTCP(反馈)组成了“控制—数据—反馈”的最小闭环:SDP 对编解码与时间基进行约束;SETUP/PLAY 决定传输形态(RTP/UDP、RTP/TCP 如果说 RTP 负责“送数据”,RTSP 则负责“告诉系统什么时候、以何种方式去送”。 1.3 RTSP 与 RTP / RTCP 的协同关系RTSP 本身并不携带音视频内容。它的职责是会话建立 + 参数协商 + 状态管理,而数据面完全交给 RTP 与 RTCP。 2.2 报文结构与传输机制RTP 报文结构极为紧凑,头部最小仅 12 字节,由以下字段组成:字段含义Version协议版本(通常为 2)P / X / CC控制位与扩展头定义Sequence Number 五、落地示例:SmartMediaKit 的 RTSP 播放模块在前文我们系统地分析了 RTSP/RTP/RTCP 三层协议的机制与关键工程挑战。
)-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数据是没有前缀数据的。 RTP数据和RTCP数据的区别在于第二个字节的通道编号 03 两个标准的区别 RFC4571标准格式: 长度(2字节) + RTP头+数据 RFC2326标准格式:$(1字节)+通道号(1字节)+长度 (2字节) + RTP头+数据 提示 上面所说的长度,都是网络字节序。