目前RTP或者基于上面的WebRTC直接使用作为直播技术的挑战性非常高,还缺乏成熟的开源工具和生态,但是RTP的低延迟特性使得很多大厂正在进行二次开发。 RTP不是不可以作为直播平台的技术选项,只是目前缺乏很好的支持,需要自己进行定制开发的部分较多。作为视频行业的领导者,TSINGSEE青犀视频率先投入研发,尝试编译RTP推流程序。 在TSINGSEE青犀视频编译RTP推流程序时,出现以下错误:*const char * 类型的值不能用于初始化 char * 类型的实体。 *command = “select * from testtable”; 2.对变量进行强转 char *command = (char *)“select * from testtable”; 3. 目前我们也在开发WebRTC打造的低延时直播平台,大家可以关注我们一起探讨了解一下。
RTP是啥? VxWorks的RTP,全称是Real-Time Process,可以翻译为实时进程。 在6.0之前,VxWorks使用的是single的内存空间,操作系统与应用程序是不分离的。 例如任务T3的栈溢出了,就有可能破坏其它任务的地址空间,如果被破坏的是系统任务T1,那很可能结果就是死机。而此时的T3,有可能已经退出了,T1就成了T3的背锅侠了。 ? 从6.0开始,VxWorks引入了RTP。这个RTP在许多地方都与其它操作系统的进程差不多,例如对POSIX的兼容性。 所以了解UNIX/Linux进程模型的程序猿,很快就可以熟悉RTP的创建、执行或者终止。 ? 不过RTP是专门为RTOS设计的,为了满足实时性的需求,它与其它系统的进程还是有很多不同的。 关于RTP的具体信息,咱们后文慢慢道来。 这正是: VX系统与时进,内核应用若比邻。 历史项目好兼容,不损实时高性能。
关于使用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?
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报文由两部分组成:报头和有效载荷。 3. X:扩展标志,占1位,如果X=1,则在RTP报头后跟有一个扩展报头。 4. CC:CSRC计数器,占4位,指示CSRC 标识符的个数。 5. 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 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-
-> 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
在视频直播等应用场合,由于生成整个媒体文件要等直播结束,也就是用户至少要在直播结束后才能看到直播节目,所以用下载方式不能实现直播。 流式传输是实现流媒体的关键技术。 SR分组的主要内容有:相应的RTP流的SSRC,RTP流中最新产生的RTP分组的时间戳和NTP,RTP流包含的分组数,RTP流包含的字节数。SR包的封装如图3所示。 图 3 RTCP头部的格式 版本(V):同RTP包头域。 填充(P):同RTP包头域。 接收报告计数器(RC):5比特,该SR包中的接收报告块的数目,可以为零。 2) RTP将RTP 数据包发往UDP端口对中偶数端口;RTCP将RTCP控制包发往UDP端口对中的接收端口。 第3章. 相关的协议 3.1. 文档 [3] http://www.cnpaf.net/,有不少协议分析文档,也有中文RFC文档,但质量不是特别高。
在《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协议上的RTSP/RTP需要打开许多UDP端口(每一路流媒体都需要2个UDP端口,一个用于接收数据,一个用于接收控制信息); 2.当因特网上的路由器没有打开这些端口的时候,第一点将会存在问题; 3 3. TCP包更容易穿透中间网络路由器。 但是,使用TCP传输协议承载RTSP/RTP需要花更多的功夫。 1. 由于二元交织,会使得RTP包封包和解包的过程变得更加复杂。 2. 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 profile-level-id=4D4033;sprop-parameter-sets=Z01AM5JUDAS0IAAAAwBAAAAM0eMGVA==,aO48gA== a=control:track1 ---- (3)
单机模式的Message Channel基于COMP实现,其速度略慢于Message Queue,但具有显著的优势(应用程序的可移植性,以供多节点Message Channel使用等),支持Kernel/RTP Message Queue 面向连接 非面向连接 双向 单向 Message长度可变 Message长度固定 Message数量无限制 Message数量固定 位置透明 Public Object支持RTP
在视频直播等应用场合,由于生成整个媒体文件要等直播结束,也就是用户至少要在直播结束后才能看到直播节目,所以用下载方式不能实现直播。 流式传输是实现流媒体的关键技术。 RTP实现者在发送RTP数据时,需先将数据封装成RTP包,而在接收到RTP数据包,需要将数据从RTP包中提取出来。 2.2. RTP的封装 一个协议的封装是为了满足协议的功能需求的。 SR分组的主要内容有:相应的RTP流的SSRC,RTP流中最新产生的RTP分组的时间戳和NTP,RTP流包含的分组数,RTP流包含的字节数。SR包的封装如图3所示。 图 3 RTCP头部的格式 版本(V):同RTP包头域。 填充(P):同RTP包头域。 接收报告计数器(RC):5比特,该SR包中的接收报告块的数目,可以为零。 2) RTP将RTP 数据包发往UDP端口对中偶数端口;RTCP将RTCP控制包发往UDP端口对中的接收端口。 第3章. 相关的协议 3.1.
1)V:RTP协议的版本号,占2位,当前协议版本号为2 2)P:填充标志,占1位,如果P=1,则在该报文的尾部填充一个或多个额外的八位组,它们不是有效载荷的一部分 3)X:扩展标志,占1位,如果X=1, 二 rtp码流 rtp载荷h264媒体流:rtp协议头和h264码流 rtp头后是rtp载荷,rtp载荷第一个字节格式和NALU头一样。 3)分片包:用于分片单个NAL单元到多个RTP包。 00 0a 7f ca 94 05 3b7f 3e 7f fe 14 2b 27 26 f8 …??.;.>.?.+’&? ——–> 0x00000303 总的来说,H264的码流的打包方式有两种,一种为annex-b byte stream format 的格式,这个是绝大部分编码器的默认输出格式,就是每个帧的开头的3~
欢迎关注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 _ _waitpidSc _write(3) _writeSc accept(3) acceptSc access(2) accessSc bind(3) bindSc chdir(1) chdirSc
一、什么是RTP 数据传输协议RTP,用于实时传输数据。RTP报文由两部分组成:报头和有效载荷。 二、RTP的会话过程 当应用程序建立一个RTP会话时,应用程序将确定一对目的传输地址。 1)V:RTP协议的版本号,占2位,当前协议版本号为2 2)P:填充标志,占1位,如果P=1,则在该报文的尾部填充一个或多个额外的八位组,它们不是有效载荷的一部分 3)X:扩展标志,占1位,如果X=1, 每个CSRC标识了包含在RTP报文有效载荷中的所有提供信源。 提供信源用来标识对一个RTP混合器产生的新包有贡献的所有RTP包的源。 载荷H264码流:红色RTP协议头,黄色H264码流 RTP头后是RTP载荷,RTP载荷第一个字节格式跟NALU头一样: F和NRI也跟NALU头一样,只有Type有些不一样:拓展24 – 31 0 赋予STAP-A,STAP-B,MTAP16,MTAP24的NAL单元类型号(Type)分别是24 25 26 27 3)分片包:用于分片单个NAL单元到多个RTP包。
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完成。
1992年11月初,我在网上发布了视频会议工具nv(Network Video),经过初步的测试,它已经可以用来向全球视频直播部分IETF 11月的会议,来自15个国家的200个子网络能够接收直播,在一周内有大概 nv源代码随后在1993年2月公布,3月份我发布了一个基于小波理论压缩方案的新版本nv。5月,我为这个工具添加了彩色视频支持。 nv成为当时互联网直播会议的主要工具之一,甚至被NASA选中直播航天飞行任务的现场报道。 nv也被用于各种硬件视频会议项目,使得这些项目可以通过高带宽以太网和 ATM 网络发送完整的 NTSC 高质量直播视频。 为什么要自己压缩视频? RTP遗憾 对于RTP我并没有什么遗憾。但我知道,人们对RTP最多的抱怨是实现RTCP的复杂性(RTCP是与主要RTP数据流量并行运行的控制协议)。
除了共享库,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协议 在实时音视频通话中,我们通常使用 UDP 作为传输层协议,使用 RTP 协议包荷载音视频数据,RTP(Real-time Transport Protocol)是一种在 Internet RTP 协议格式如下,红色部分为 RTP 协议可选字段,RTP 协议最小为 12 byte。 Extension header length 决定 Extension header length:表示后面的 Extension header 共有几个字节,长度以 4 字节为单位,例如 length = 3 表示 Extension header 一共占 3*4=12 个字节 Extension header:具体的扩展头部,由 ID,L,data 组成,可以是 one-byte header 或者 two-byte 实战 使用JRTPLIB发送/接收RTP数据包 使用RTP包荷载H264码流 RTP扩展头部Audio Level的应用(mediasoup显示当前通话Speaker) 发布者:全栈程序员栈长,转载请注明出处
1.RTP协议 RTP:即可心跑在TCP也可以跑在UDP上,实时流协议,所以通常是跑在UDP上。 前 12 个字节出现在每个 RTP 包中,仅仅在被混合器插入时,才出现 CSRC 识别符列表。 填充可能用于某些具有固定长度的加密算法,或者用于在底层数据单元中传输多个 RTP 包。 (3)扩展(X):1 比特,若设置扩展比特,固定头(仅)后面跟随一个头扩展。 其他的负载类型码可以通过非 RTP 方法动态定义。RTP发送端在任意给定时间发出一个单独的 RTP 负载类型;此域不用来复用不同的媒体流。 几个连续的 RTP 包如果是同时产生的。如:属于同一个视频帧的 RTP 包,将有相同的序列号。 不同媒体流的 RTP 时间戳可能以不同的速率增长。而且会有独立的随机偏移量。 RTP 包流的源,用 RTP 报头中 32 位数值的SSRC 标识符进行标识,使其不依赖于网络地址。
要想使用WindML,需要先将源码编译为库,内核态就用DKM来编译,用户态当然就用RTP了 打开Workbench,建个RTP: ? 给它起个名字,然后选择合适的build spec。 接下来,根据DKM里的配置来config这个windml,两者要保持一致 Build这个RTP之后,就得到了WindML在用户态的两个库 ? 现在,可以在RTP中使用WindML了。先建个VIP ? BSP就用simpc,Tool chain要与之前的DKM和RTP的build spec都一致。其它选项用默认值就行了 ? 接下来,新建一个RTP,build spec与之前的工程一致,例如上文的SIMPENTIUMgnu_RTP,其它选项使用默认值。 然后在这个RTP里也添加Middleware Component,不过这次选择Application Support ? 添加WindML的代码后,就可以在RTP里执行UGL应用了 ?