下面以“大牛直播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)。 客户端再分析该SDP描述,并为会话中的每一个流发送一个RTSP建立命令(SETUP),RTSP建立命令告诉服务器客户端用于接收媒体数据的端口。 流媒体连接建立完成后,客户端发送一个播放命令(PLAY),服务器就开始在UDP上传送媒体流(RTP包)到客户端。 在播放过程中客户端还可以向服务器发送命令来控制快进、快退和暂停等。 第五步: 数据传送播放中 S->C:发送流媒体数据 // 通过RTP协议传送数据 6.
发送一个GET_PARAMETER 消息 GET_PARAMETER rtsp://192.168.16.210/live/substream/ RTSP/1.0 CSeq: 8 User-Agent: = (data[2] << 8) | data[3]; int pt = data[1]&0x7f; int marker = ((data[1]&0x80) >> 7); uint8_t *payload %d, old_type:%d, nalu_type:%d marker:%d, len:%d,last_len:%d\r\n", seq,old_type, nalu_type, marker, len :%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 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 G722 8k HZ 1 audio 18 G.729 8k HZ 1 audio 20 SVACA(SVAC音频) 8k HZ 1 audio 96 PS 90k HZ video M(marker) ? 值为0,表示该数据包非一帧数据的最后一帧!wireshark的解析: ? ps:当该值为1时,表示该数据包是一帧数据的最后一个数据包!
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 _t version:2; uint8_t payloadtype:7; uint8_t marker:1; #endif // RTP_BIG_ENDIAN uint16_t sequencenumber
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这些协议在服务于流媒体传输方面有着共同的目标和追求,同时也在各自擅长的领域发挥着重要作用。
此版本号固定为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; //标志位,由详细协议规定其值。 long timestamp; /* bytes 8-11 */ unsigned long ssrc; /* 事实上,它是一个随机生成ID,他表示RTP联系。
3、RTSP和RTP(TRCP)的联系 RTP:Realtime Transport Protocol实时传输协议。RTP提供时间标志,序列号以及其他能够保证在实时数据传输时处理时间的方法。 RCTP是RTP的控制部分,用来保证服务质量和成员管理。RTP和RTCP是一起使用的。 RTSP:Realtime Streaming Protocol 实时流传输协议。 RTSP具体数据传输交割RTP,提供对流的控制。 RTP是基于UDP协议的,UDP不用建立连接,效率更高。但允许丢包,这就要求在重新组装媒体的时候多做一些工作。 Cache-Control: no-cache Transport: RTP/AVP/TCP;unicast;interleaved=0-1;ssrc=6B8B4567 4)PLAY 客户端发送播放请求 +AFIAAAAbDzAAABtQ7gQMDPAAABAAAAASAAhED6KFAg8KIfBgEC" a=StreamName:string;"Video Track" 9、总结 在RTSP交互过程中
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 设置为零。
协议介绍 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:(净荷类型
基因或者叫标志基因,它们是经过反复验证得到的。 怎么和marker基因联系起来?数万个基因,哪些才是这个cluster的marker基因? 另外,使用两两比较的方法还会提供有关marker基因更多的信息,比如能看到哪些clusters是由某个marker基因区分的 2.2 如果只关注上调基因 之前findMarkers目的是选取上调、下调基因作为 如果设置pval.type="all",那么Cd4或Cd8基因都不会列入marker基因结果,因为它们都会在两个亚群有差异表达情况 还有另一种方法:pval.type="any" ,就是只要在一个cluster 如果在检测marker基因的时候带着它们,可能会结果产生干扰。
但是我们如果在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,进行发送。 下面是一个rtsp客户端请求 通过rtp over tcp方式建立连接报文; SETUP之后,RTP数据将通过用来发送RTSP命令的TCP Socket进行发送。 { unsigned int magic : 8;// $ unsigned int channel : 8; //0-1 unsigned int rtp_len
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 PLAY消息,PLAY请求成功之后,RTSP server就会一直向客户端发送RTP数据包!开始“播放”之后,我们相应的就会有暂停,停止等操作! 本篇我们就先来看下RTSP的PAUSE! PAUSE作用 暂停请求会使得流传输暂时中断(相当于暂停),如果请求的URL指向一个流地址,则仅针对该流的回放和录制会被中断! RTSP URI表示请求的流地址,RTSP Version表示RTSP的版本号; CSeq表示消息序列号; Session表示会话ID,SETUP请求时服务端返回的ID。 我们来看一个实际的例子吧,就用官方的吧: PAUSE rtsp://example.com/fizzle/foo RTSP/1.0\r\n CSeq:834\r\n Session:12345678\r 格式也比较简单,Rtsp Version表示版本号,状态码表示回复的状态,状态描述是对状态码的描述;CSeq表示序列号;Date表示时间!
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:
:编码前数据(目前支持的有YV12/NV21/NV12/I420/RGB24/RGBA32/RGB565等数据类型);编码后数据(如无人机等264/HEVC数据,或者本地解析的MP4音视频数据);拉取RTSP build.gradle 配置splits { abi { enable true reset() include 'armeabi-v7a', 'arm64-v8a (long var1, String var3, double var4)回放 RTSP 缩放命令回调,返回相关参数ntsOnPlaybackMANSRTSPSeekCommand(long var1, var1, String var3)终止回放回调,返回相关参数ntsOnPlaybackDialogTerminated(long var1, String var3)回放对话终止回调,返回相关参数8. rtp_sender_handle, int is_enable)启用或禁用 RTP 发送器接收功能,参数为发送器句柄和是否启用标志public native int SetRTPSenderReceiveSSRC
针对音视频数据量大的特点,有一套专门的网络传输协议RTP/RTSP,它的运行流程是这样的: RTSP RTSP(Real Time Streaming Protocol)是一款网络控制协议,用来控制流媒体服务器的 当PLAY命令发送后,就进入了第三部分RTP协议传输的流媒体数据包。 withTag:(long)tag { NSString *dataString = [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding r\n"]; [dataString appendString:@"\r\n"]; NSData *data = [dataString dataUsingEncoding:NSUTF8StringEncoding ; [dataString appendString:@"\r\n"]; NSData *data = [dataString dataUsingEncoding:NSUTF8StringEncoding
从协议演化看,RTSP(控制)、RTP(承载)、RTCP(反馈)组成了“控制—数据—反馈”的最小闭环:SDP 对编解码与时间基进行约束;SETUP/PLAY 决定传输形态(RTP/UDP、RTP/TCP 如果说 RTP 负责“送数据”,RTSP 则负责“告诉系统什么时候、以何种方式去送”。 1.3 RTSP 与 RTP / RTCP 的协同关系RTSP 本身并不携带音视频内容。它的职责是会话建立 + 参数协商 + 状态管理,而数据面完全交给 RTP 与 RTCP。 RTP 的时钟率(clock rate)取决于负载类型: 视频:一般使用 90 kHz 时间基(每个 tick ≈ 11.1 μs); 音频:常见 8 kHz、16 kHz、48 kHz 等; 其他负载可自定义时钟步长 五、落地示例:SmartMediaKit 的 RTSP 播放模块在前文我们系统地分析了 RTSP/RTP/RTCP 三层协议的机制与关键工程挑战。
RTSPS 服务器,支持亚马逊echo show这样的设备 RTSP 播放器,支持RTSP代理,支持生成静音音频 RTSP 推流客户端与服务器 支持 rtp over udp rtp over tcp rtp over http rtp组播 四种RTP传输方式 。 支持H265编码 服务器支持RTSP推流(包括rtp over udp rtp over tcp方式) 支持任意编码格式的rtsp推流,只是除H264/H265+AAC外无法转协议 RTMP RTMP 由于本项目主体代码在macOS/linux下开发,部分源码采用的是无bom头的UTF-8编码;由于windows对于utf-8支持不甚友好,所以如果发现编译错误请先尝试添 加bom头再编译。 也可以通过参考这篇博客解决: vs2015:/utf-8选项解决UTF-8 without BOM 源码中文输出乱码问题 参考案例 IOS摄像头实时录制,生成rtsp/rtmp/hls/http-flv