以下文章介绍了3种常用工具1.RTP流发送器本工具可以模式摄像头或者上游网关,或者NVR将RTP音视频流发送出来. (只要是RTP流即可,对封装格式编码格式不限),也可剥离信令服务逻辑,单独用于调试媒体服务器部分,使用方式 如: rtpplay.exe -T -f RTP文件名 -s 发送端口号 目的IP地址/目的端口号 pwd=7ep7 提取码: 7ep72.RTP(264播放器)本工具为RTP(h264)播放器,用于调试RTSP信令,SIP信令,媒体部分可以用该播放器模拟和验证链接: https://pan.baidu.com /s/1Wl-Ixq4Vr-LL0d_fgMOmkw? pwd=iq2p 提取码: iq2p3.RTP(PS播放器)RTP(PS)播放器可以用于信令调试,国标PS流接收,解封,播放可以用该播放器模拟播放,实现媒体和信令分离开发和调试链接: https://pan.baidu.com
关于使用rtp推流,TSINGSEE青犀视频团队实际已经研发了很长时间,其中也碰到了不少问题,比如RTP推流客户端无法解析播放,或者遇到不同的报错,但这些目前都已经有了比较完善的解决办法。 在使用RTP推流时,默认ffmpeg使用的打包模式是packetization-mode=1,本文我们和大家分享另一个比较实用的技巧,就是使用ffmpeg配置rtp打包模式。 如何修改打包模式? 关于RTP打包模式的说明如下: 目前ffmpeg默认使用的是1: Not interleaved 模式,针对客户的需要,服务端不支持STAP-A的组包模式,需要每个包单独发送,所以需要配置Single 配置完成后,还有个问题,需要配置pkt size,否则I帧无法完整发送,默认pkt size是1024个字节,而一般I帧都大于1024个字节,导致I帧发送不完整,图像传输失败,需要配置pkt size,在rtp url后面加上如下所示内容: rtp://192.168.99.138:6666?
-> cmd [vxWorks *]# rtp Display process list [vxWorks *]# rtp [rtpId or Name] Display summary information about processes in memory [vxWorks *]# rtp exec <filename> Execute a RTP file named <filename> [vxWorks -X : (Vx7) do not return the exit code of foreground RTP, just return 0 -- : mark the end of "rtp exec " options [vxWorks *]# rtp attach Display the attachment list [vxWorks *]# rtp attach [rtpId or Name] *]# rtp detach Detache the shell session from the current memory context [vxWorks *]# rtp foreground
RTP协议格式: 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 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+- 报文由两个部分构成--RTP报头和RTP的负载: RTP报文由两部分组成:报头和有效载荷。 X:扩展标志,占1位,如果X=1,则在RTP报头后跟有一个扩展报头。 4. CC:CSRC计数器,占4位,指示CSRC 标识符的个数。 5. 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 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-
RTP是啥? VxWorks的RTP,全称是Real-Time Process,可以翻译为实时进程。 在6.0之前,VxWorks使用的是single的内存空间,操作系统与应用程序是不分离的。 从6.0开始,VxWorks引入了RTP。这个RTP在许多地方都与其它操作系统的进程差不多,例如对POSIX的兼容性。 所以了解UNIX/Linux进程模型的程序猿,很快就可以熟悉RTP的创建、执行或者终止。 ? 不过RTP是专门为RTOS设计的,为了满足实时性的需求,它与其它系统的进程还是有很多不同的。 有了RTP,就可以在用户模式下执行应用程序和操作系统的其它功能,这些功能在内核和应用程序之间具有清晰的划分。这种体系结构通常被称为进程模型。 同时,6.x与5.5保持了高度的兼容。 关于RTP的具体信息,咱们后文慢慢道来。 这正是: VX系统与时进,内核应用若比邻。 历史项目好兼容,不损实时高性能。
RTP用来为端到端的实时传输提供时间信息和流同步,但并不保证服务质量。服务质量由RTCP来提供。这些特点,在第4章可以看到。 2.1.2. RTP实现者在发送RTP数据时,需先将数据封装成RTP包,而在接收到RTP数据包,需要将数据从RTP包中提取出来。 2.2. RTP的封装 一个协议的封装是为了满足协议的功能需求的。 CSRC计数器(CC):4比特,含有固定头部后面跟着的CSRC的数目。 标记位(M):1比特,该位的解释由配置文档(Profile)来承担. 载荷类型(PT):7比特,标识了RTP载荷的类型。 SR分组的主要内容有:相应的RTP流的SSRC,RTP流中最新产生的RTP分组的时间戳和NTP,RTP流包含的分组数,RTP流包含的字节数。SR包的封装如图3所示。 第4章. 常见的疑问 4.1. 怎样重组乱序的数据包 可以根据RTP包的序列号来排序。 4.2. 怎样获得数据包的时序 可以根据RTP包的时间戳来获得数据包的时序。 4.3.
在《Task之调度策略》里介绍了VxWorks的主要调度策略,而有了RTP之后,系统又是如何调度的呢? 其实非常非常简单:RTP不参与调度,VxWorks还是使用之前的调度策略,即所有Task基于优先级抢占,以及默认关闭的时间片轮转。 如果你不打算使用pthread,现在就可以跳到文末点赞了 ----------分割线--------- 不过,为了更好的支持POSIX标准,VxWorks在RTP里引入了POSIX的Thread调度策略 事实上,要想在RTP里使用POSIX的Thread,必须要包含这种调度策略:INCLUDE_POSIX_PTHREAD_SCHEDULER ? 从名字上就可以看出来,这种策略只对RTP里的Thread有效。而Kernel里的Task和Thread,以及RTP里的Task,用的都是VxWorks的传统策略 ?
Task可以注册Hook,RTP也可以,只需在VIP中包含组件INCLUDE_RTP_HOOKS。 define RTP_GLOBAL_SYMBOLS 0x01 /* register global symbols for RTP */ #define RTP_LOCAL_SYMBOLS 0x02 /* idem for local symbols */ #define RTP_ALL_SYMBOLS (RTP_GLOBAL_SYMBOLS | RTP_LOCAL_SYMBOLS ) #define RTP_DEBUG 0x10 /* set RTP in debug mode when created */ #define RTP_BUFFER_VAL_OFF 例如RTP A正在创建RTP B,这种Hook是在RTP A的上下文里执行。Hook创建的对象,属于RTP A。
中间网络路由器很容易就过滤或者忽略掉UDP数据包; 4. UDP是不可靠传输协议,媒体包在因特网上传输时会面临着丢包。 但是我们如果在TCP传输协议上承载RTSP/RTP将解决这些问题。 1. RTP和RTCP数据会以$符号+1个字节的通道编号+2个字节的数据长度,共4个字节的前缀开始,RTSP数据是没有前缀数据的。 RTP数据和RTCP数据的区别在于第二个字节的通道编号, // 下面给出一个 RTP OVER TCP 方式数据头结构定义 4oct / typedef struct rtsp_interleaved SETUP rtsp://222.201.145.236/slamtv60.264/track1 RTSP/1.0 CSeq: 4 User-Agent: LibVLC/1.1.11 (LIVE555 服务端响应DESCRIBE请求所发回的报文, RTSP/1.0 200 OK CSeq: 4 Date: Wed, Mar 07 2012 03:48:18 GMT Transport: RTP/AVP
则在RTP报头后跟有一个扩展报头 4)CC:CSRC计数器,占4位,指示CSRC标识符个数 5)M:标志,占1位,不同的有效载荷有不同的含义,对于视频,标记一帧的结束;对于音频,标记会话的开始。 封装成 RTP 包将如下: [ RTP Header ] [ 67 42 A0 1E 23 56 0E 2F … ] 即只要去掉 4 个字节的开始码就可以了. 2)组合包:本类型用于聚合多个NAL单元到单个 Q~._.Bq. 17 65 62 a1 f1 44 dc df 4b 4a 38 aa 96 b7 dd 24 .eb??D??KJ8???? 4)SPS/PPS 一个frame分割成多个slice,一个slice分割成多个宏块。一个Slice编码之后被打包进一个NAL单元。 一个MP4文件只有一个SPS,但是有很多PPS,SPS必须在所有NALU的最开头。
单机模式的Message Channel基于COMP实现,其速度略慢于Message Queue,但具有显著的优势(应用程序的可移植性,以供多节点Message Channel使用等),支持Kernel/RTP Message Queue 面向连接 非面向连接 双向 单向 Message长度可变 Message长度固定 Message数量无限制 Message数量固定 位置透明 Public Object支持RTP
RTP用来为端到端的实时传输提供时间信息和流同步,但并不保证服务质量。服务质量由RTCP来提供。这些特点,在第4章可以看到。 2.1.2. RTP实现者在发送RTP数据时,需先将数据封装成RTP包,而在接收到RTP数据包,需要将数据从RTP包中提取出来。 2.2. RTP的封装 一个协议的封装是为了满足协议的功能需求的。 CSRC计数器(CC):4比特,含有固定头部后面跟着的CSRC的数目。 标记位(M):1比特,该位的解释由配置文档(Profile)来承担. 载荷类型(PT):7比特,标识了RTP载荷的类型。 SR分组的主要内容有:相应的RTP流的SSRC,RTP流中最新产生的RTP分组的时间戳和NTP,RTP流包含的分组数,RTP流包含的字节数。SR包的封装如图3所示。 第4章. 常见的疑问 4.1. 怎样重组乱序的数据包 可以根据RTP包的序列号来排序。 4.2. 怎样获得数据包的时序 可以根据RTP包的时间戳来获得数据包的时序。 4.3.
一、什么是RTP 数据传输协议RTP,用于实时传输数据。RTP报文由两部分组成:报头和有效载荷。 二、RTP的会话过程 当应用程序建立一个RTP会话时,应用程序将确定一对目的传输地址。 则在RTP报头后跟有一个扩展报头 4)CC:CSRC计数器,占4位,指示CSRC标识符个数 5)M:标志,占1位,不同的有效载荷有不同的含义,对于视频,标记一帧的结束;对于音频,标记会话的开始。 每个CSRC标识了包含在RTP报文有效载荷中的所有提供信源。 提供信源用来标识对一个RTP混合器产生的新包有贡献的所有RTP包的源。 载荷H264码流:红色RTP协议头,黄色H264码流 RTP头后是RTP载荷,RTP载荷第一个字节格式跟NALU头一样: F和NRI也跟NALU头一样,只有Type有些不一样:拓展24 – 31 0 封装成 RTP 包将如下: [ RTP Header ] [ 67 42 A0 1E 23 56 0E 2F … ] 即只要去掉 4 个字节的开始码就可以了.
欢迎关注VxWorks567 用户模式与内核模式使用不同的指令集和MMU配置,因此在RTP中不能直接访问内核的资源,包括内核函数、内核数据,以及driver等。 如果迫不得已,RTP中必须要使用内核的某些机制,怎么解决?可以在RTP中重写相应功能,或者通过System Call! System Call对使用者是透明的,它的大致执行流程如下:RTP里调用System Call封装的API时,系统执行一个特定于体系结构的Trap操作,将CPU从用户模式更改为内核模式;完成Trap请求的操作后 详情如下 RTP函数(参数数量) 对应的内核操作 _close(1) _closeSc _creat(2) _creatSc _edrErrorInject(6) _edrErrorInjectSc _ semCtlSc send(4) sendSc sendmsg(3) sendmsgSc sendto(6) sendtoSc setprlimit(4) setprlimitSc setsockopt
除了共享库,RTP也可以像内核态一样,去使用静态库 - Static Library。 它俩的区别是 RTP即使只调用共享库中的一个函数,也会加载整个库文件;RTP如果只使用静态库中的一个函数,则只会链接该函数所在的.o文件,而不是整个.a文件 多个RTP使用同一个共享库时,一共只需要加载一次 ;多个RTP使用同一个静态库时,每个RTP都要去链接、加载它 静态库的使用就简单多了,VIP都不需要包含INCLUDE_SHL 还是以Vx69为例,新建一个RTP工程 根据Target选择相应的Active build spec Build tool改为Librarian 将代码加入工程,build得到.a文件 这时就可以在应用程序的RTP里调用这个静态库的函数了 只需要在工程的属性中包含这个.a
RTP和RTCP是处理所有多媒体传输的重要协议,于1996年1 月在RFC 1889中定义。在本篇文章中,RTP协议的作者之一Ron Frederick将为我们讲述这个如此重要的协议是如何诞生的。 RTP趣事 其中一件趣事是,我开发了一版使用IP组播的经典Spacewar游戏。 总的来说,RTP可以传输任何不需要完美有序交付的实时数据流。因此,除了音频和视频,我们还可以创建诸如共享白板之类的东西,甚至还可以让RTP传输文件,尤其是与 IP 组播一起使用时。 RTP遗憾 对于RTP我并没有什么遗憾。但我知道,人们对RTP最多的抱怨是实现RTCP的复杂性(RTCP是与主要RTP数据流量并行运行的控制协议)。 RTP四位作者简介: Ron Frederick:美国计算机科学家,RTP协议作者之一,他的Github:https://github.com/ronf/。
AIE支持两种类型的RTP,一种是异步(Asynchronous),通常由PS或其他AIE Kernel控制。“异步”意味着RTP可以随时被更改。 在每次Kernel被调用时,RTP都会被读取,而不会进行任何同步处理。这种机制适合于参数不经常更新的场合,例如滤波器系数。另一种为同步RTP(Synchronous)。 在描述AIE Kernel sine时,phase_increment为输入参数,这里的名字是形参名,本质上就是RTP,只是RTP在graph.h中会另起名字。 在描述graph时,将RTP定义为input_port,并起名字为trigger,如下图第26行所示。同时确定RTP与AIE Kernel的连接关系,如下图第33行所示。 这是和同步RTP的最大区别。在同步模式下,graph的run是受RTP的update控制的。在异步模式下,需要通过wait等待graph的run完成。
RTP的特点是隔离保护,不能直接访问Kernel。因此,在编程上,会有一些限制。 最大的限制是内存的访问。 如果RTP与RTP之间,或者RTP与Kernel之间,需要传递少量数据,可以使用Public的Message Queue。大量数据,可以使用共享数据区。 但可以使用dup()、dup2()进行整个RTP的IO重定向。 还有一些Kernel的机制不能在RTP里使用了 intLock()/intCpuLock()、intUnlock()/intCpuUnlock(),因为RTP里不能锁中断 taskLock()/taskCpuLock ()、taskUnlock()/taskCpuUnlock(),因为RTP里不能锁调度策略 taskInit(),可以使用taskCreate()代替 taskOptionsSet(),因为RTP任务的
RTP 协议格式如下,红色部分为 RTP 协议可选字段,RTP 协议最小为 12 byte。 header,扩展头部个数由 Extension header length 决定 Extension header length:表示后面的 Extension header 共有几个字节,长度以 4 字节为单位,例如 length = 3 表示 Extension header 一共占 3*4=12 个字节 Extension header:具体的扩展头部,由 ID,L,data 组成,可以是 one-byte ID 和 L 分别占 4 bit,加起来等于 one-byte,ID 表示扩展头部 ID 标记,L 表示 extension data 所占字节数 -1,例如 L = 0 时实际 data 占一个字节, 由于头部需要按 4 字节对齐,因此中间补充了 padding 数据,最后一个 extension header data 占 4 字节。
1.RTP协议 RTP:即可心跑在TCP也可以跑在UDP上,实时流协议,所以通常是跑在UDP上。 前 12 个字节出现在每个 RTP 包中,仅仅在被混合器插入时,才出现 CSRC 识别符列表。 (4)CSRC 计数(CC):4 比特,CSRC 计数包含了跟在固定头后面 CSRC 识别符的数目。 (5)标志(M):1 比特,标志的解释由具体协议规定。 其他的负载类型码可以通过非 RTP 方法动态定义。RTP发送端在任意给定时间发出一个单独的 RTP 负载类型;此域不用来复用不同的媒体流。 几个连续的 RTP 包如果是同时产生的。如:属于同一个视频帧的 RTP 包,将有相同的序列号。 不同媒体流的 RTP 时间戳可能以不同的速率增长。而且会有独立的随机偏移量。 RTP 包流的源,用 RTP 报头中 32 位数值的SSRC 标识符进行标识,使其不依赖于网络地址。