问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501

音视频同步!RTCP协议解析及代码实现

发布网友 发布时间:2024-10-01 14:51

我来回答

1个回答

热心网友 时间:2024-10-13 04:00

RTCP是实时控制协议(Real-TimeControlProtocol)的缩写。RTCP由RFC3550定义(取代作废的RFC1889)。

实时传输协议(RTP)和实时控制协议(RTCP)结合使用,可以监视大型多播网络的数据传递。RTP承载媒体流,而RTCP用于监视传输统计信息和服务质量。监视使接收器能够检测是否有任何丢包并补偿任何延迟抖动。

两种协议都独立于基础传输层协议和网络层协议工作。RTP标头中的信息告诉接收器如何重建数据,并描述编解码器比特流的打包方式。

下面我们重点讲解RTCP功能、RTCP信息包等。最后RTCP协议解析实现。

RTCP有哪些功能

1、RTCP主要功能是提供有关质量的反馈数据分发。这是RTP角色不可或缺的一部分,传输协议,与流量和拥塞有关其他传输协议的控制功能。

2、RTCP带有RTP的持久性传输级别标识符源称为规范名称或CNAME。自从如果发现冲突或程序重新启动,接收方要求CNAME跟踪每个参与者。

接收者也可能要求CNAME将来自给定参与者的多个数据流关联到集合中相关RTP会话的数量,例如同步音频和视频。媒体间同步还需要NTP和RTP数据发送方在RTCP数据包中包含的时间戳。

3、前两个功能要求所有参与者发送RTCP数据包,因此必须控制速率以使RTP能够扩大到大量参与者。通过让每个参与者将其控制包发送给所有其他人,每个人都可以独立观察参与者的数量。

4、这项功能对于参加者可以任意进入和离开的松散会话进程十分有用,参加者可以自由进入或离开,没有成员控制或参数协调。

功能1-3应该在所有环境中使用,尤其是在IP多播环境。RTP应用程序设计师应避免只能在单播模式下工作且无法扩展到的机制更大的数字。RTCP的传输可以单独控制对于发送者和接收者,适用于例如单向链接,而接收者没有反馈可能的。

RTCP协议的端口

RTSP通常使用RTP协议来传送实时流,RTP一般使用偶数端口,而RTCP使用相邻的奇数端口,即RTP端口号+1。

RTP端口

RTCP端口

RTCP信息包有哪些

在RTCP通信控制中,RTCP协议的功能是通过不同类型的RTCP包来实现的。RTCP也是基于UDP包来传送的,主要有五种类型的封包:

SR:发送端报告,由发送RTP数据报的应用程序或中端发出的。

RR:接收端报告,由接受但不发送RTP数据报的应用程序或中端发出。

SDES:源描述,传递与会话成员有关的标识信息的载体,如用户名、邮件、电话等。

BYE:通知离开,通知回话中的其他成员将退出会话。

APP:由应用程序自己定义,作为RTCP协议的扩展。

#defineRTCP_SR200#defineRTCP_RR201#defineRTCP_SDES202#defineRTCP_BYE203#defineRTCP_APP204

我们可以根据这五种类型包判断RTCP头部

staticbooldissect_rtcp_heur(u_char*rtcp_info,intPayloadLen){unsignedintoffset=0;unsignedintfirst_byte=0;unsignedintpacket_type=0;/*查看第一个字节*/first_byte=rtcp_info[offset];/*版本位是否设置为2*///printf("version:%d\n",((first_byte&0xC0)>>6));if(((first_byte&0xC0)>>6)!=2){returnfalse;}/*看包类型*/offset+=1;packet_type=rtcp_info[offset];//printf("packet_type:%d\n",packet_type);/*复合数据包中的第一个数据包应该是发送方或接收者报告*/if(!((packet_type==RTCP_SR)||(packet_type==RTCP_RR)||(packet_type==RTCP_BYE)||(packet_type==RTCP_APP)||(packet_type==RTCP_PSFB))){returnfalse;}/*总长度必须是4个字节的倍数*///printf("PayloadLen:%d\n",PayloadLen);if(PayloadLen%4){returnfalse;}/*OK,dissectasRTCP*/dissect_rtcp(rtcp_info,packet_type,offset,PayloadLen);returntrue;}

RTCP协议报文格式

SR:发送端报告

版本(V):同RTP包头部

填充(P):同RTP包头部。

接收报告计数器(RC):5b该SR包中接收的报告块的数目。

包类型(PT):8bitSR包类型为200

长度(length):SR包以32bit为1单位的长度减1

同步源(SSRC):SR包发送的同步源标识符。与对应RTP包中的SSRC一样。

NTP时间戳(NetworkTimeProtocol):SR包发送时的绝对时间。用于同步不同的流。

RTP时间戳:与NTP时间戳对应,与RTP包中的时间戳具有相同的初始值。

Send’sPacketcount:从开始发包到产生这个SR包的这段时间内发送者发送的有效数据的总字节数,不包括头部和填充,发送者改变SSRC时,该域要清零。

同步源n的SSRC标识符:该报告中包含的是从该源接收到的包的统计信息。

丢失率:表明从上一个SR或RR包发出依来从同步源n发送的RTP包的丢失率。

累计丢失数据:从开始接受SSRC_n的包到发送SR这个时间段内SSRC_n发送的RTP丢失的总数目。

收到的扩展最大序列号:从SSRC_n收到的从RTP数据包中的最大序列号。

接收抖动(Interarrivaljitter):RTP数据包接收时间的统计方差估计。

上次SR时间戳(LastSR):取最近从SSRC_n收到的SR包中的NTP时间戳中的中间32bit。如果还未收到SR包,则为0。

上次依赖SR延迟(DelaysinceLastSR):从上次SSRC_n收到SR包到发送本包的延迟

Wireshark抓包:

活动会话的参与者在发送和接收RTP分组时使用SR。SR有三个不同的部分:报头信息、发送方信息和许多接收方报告块。SR也可以有一个与大纲相关的扩展域。

Wireshark抓包:

SDES:源描述

SDES提供了传递与会话成员有关的标识信息的载体,如用户名、邮件、电话等。每个RTCP混合分组中必须有SDES分组。

报头包含一个长度域、一个净荷类型域(PT=202)和一个源计数(RC)域。RC域5个bit,表示分组中信息块的数量。

每个信息块包含一个SSRC或CSRC值,其后跟着一个或多个的标识符和一些可用于SSRC或CSRC的信息。

CNAME项的SDES包必须包含在每个组合RTCP包中。SDES包可能包括其他源描述项,这要根据特别的应用需要,并同时考虑带宽*。

Wireshark抓包:

SDES源描述包提供了直观的文本信息来描述会话的参加者,包括CNAME、NAME、EMAIL、PHONE、LOC等源描述项。

这些为接收方获取发送方的有关信息提供了方便。SDES包由包头与数据块组成,数据块可以没有,也可有多个。包头由版本(V)、填充(P)、长度指示、包类型(PT)和源计数(SC)组成。

PT占8位,用于识别RTCP的SDES包,SC占5位,指示包含在SDES包中的SSRC/CSRC块数量,零值有效,但没有意义。

BYE:通知离开

BYE分组用于表示一个或多个媒体源不再是处于激活状态。

Wireshark抓包:

作为可选项,BYE包可包括一个8位八进制计数,后跟文本信息,表示离开原因。

最后,组合包中每个RTCP包可独立处理,而不需要按照包组合的先后顺序处理。

在组合包中有以下几条强制约束。

只要带宽允许,在SR包或RR包中的接收统计应该经常发送,因此每个周期发送的组合RTCP包中应包含报告包。

每个组合包中都应该包含SDESCNAME,因为新接收者需要通过接收CNAME来识别源,并与媒体联系进行同步。

组合包前面是包类型数量,其增长应该受到*。

RTCP协议如何实现媒体流的同步

通过抓包分析RTCP发送端报告,RTP的同步其实就靠这三个域:

senderSSRC:SR包发送的同步源标识符。与对应RTP包中的SSRC一样。

NTPtimestamp:SR包发送时的绝对时间。用于同步不同的流。

RTPtimestamp:与NTP时间戳对应,与RTP包中的时间戳具有相同的初始值。

那怎么计算NTP时间呢?在RTCP中NTP时间存放在8个字节中,分为:MSW和LSW,分别占用4个字节。

constchar*tvb_ntp_fmt_ts_sec(u_char*rtcp_info,intoffset){uint32_ttempstmp=0;time_ttemptime=0;structtm*bd;char*buff=NULL;tempstmp=ntohl(*(uint32_t*)(rtcp_info+offset));if(tempstmp==0){return"NULL";}/*Weneedatemporaryvariableheresotheunsignedmath*workscorrectly(foryears>2036accordingtoRFC2030*chapter3).*/temptime=(time_t)(tempstmp-NTP_BASETIME);bd=gmtime(&temptime);if(!bd){return"Notrepresentable";}buff=(char*)malloc(NTP_TS_SIZE);snprintf(buff,NTP_TS_SIZE,"%s%2d,%d%02d:%02d:%02dUTC",mon_names[bd->tm_mon],bd->tm_mday,bd->tm_year+1900,bd->tm_hour,bd->tm_min,bd->tm_sec);returnbuff;}

NTPtimestamp

/*NTPtimestamp*/ts_msw=ntohl(*(uint32_t*)(rtcp_info+offset));printf("ts_msw:0x%x\n",ts_msw);ts_lsw=ntohl(*(uint32_t*)(rtcp_info+offset+4));printf("ts_lsw:0x%x\n",ts_lsw);printf("MSW:%s\n",tvb_ntp_fmt_ts_sec(rtcp_info,offset));offset+=8;

RTCP协议实现

下面我给出对RTCP协议解析实现的代码,根据回放报文,解析字段信息。

/*接收者/发送者计数是最后5位*/#defineRTCP_COUNT(octet)((octet)&0x1F)#defineRTCP_PT_MIN192/*SupplementalH.261specificRTCPpackettypesaccordingtoSectionC.3.5*/#defineRTCP_FIR192#defineRTCP_NACK193#defineRTCP_SMPTETC194#defineRTCP_IJ195/*RTCPpackettypesaccordingtoSectionA.11.1*//*Andhttps://www.iana.org/assignments/rtp-parameters/rtp-parameters.xhtml*/#defineRTCP_SR200#defineRTCP_RR201#defineRTCP_SDES202#defineRTCP_BYE203#defineRTCP_APP204#defineRTCP_RTPFB205#defineRTCP_PSFB206#defineRTCP_XR207#defineRTCP_AVB208#defineRTCP_RSI209#defineRTCP_TOKEN210#defineRTCP_PT_MAX210staticconstcharmon_names[12][4]={"Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec"};/**datastructuretoholdtimevalueswithnanosecondresolution*/typedefstruct{time_tsecs;intnsecs;}nstime_t;/**1900-01-0100:00:00(proleptic?)UTC.*Usedbyanumberoftimeformats.*/#defineEPOCH_DELTA_1900_01_01_00_00_00_UTC2208988800U/**NTP_BASETIMEisinfactepoch-ntp_start_time;ntp_start_time*isJanuary1,2036,00:00:00UTC.*/#defineNTP_BASETIMEEPOCH_DELTA_1900_01_01_00_00_00_UTC#defineNTP_FLOAT_DENOM4294967296.0#defineNTP_TS_SIZE100/*解剖长度字段。附加到此字段的文字表示转换为的实际字节数(即(原始值+1)*4)*/staticintdissect_rtcp_length_field(u_char*rtcp_info,intoffset){uint16_traw_length=ntohs(*(uint16_t*)(rtcp_info+offset));printf("(%ubytes)\n",(raw_length+1)*4);offset+=2;returnoffset;}staticintdissect_rtcp_rr(u_char*rtcp_info,intoffset,intcount,intpacket_length){intcounter=0;uint8_trr_flt=0;intrr_offset=offset;counter=1;while(counter<=count){uint32_tlsr=0,dlsr=0;/*Createanewsubtreeforalengthof24bytes*//*SSRC_nsourceidentifier,32bits*/offset+=4;/*Fractionlost,8bits*/rr_flt=rtcp_info[offset];offset++;/*Cumulativenumberofpacketslost,24bits*/offset+=3;/*Sequencenumbercycles*/offset+=2;/*highestsequencenumberreceived*/offset+=2;/*Interarrivaljitter*/offset+=4;/*LastSRtimestamp*/lsr=ntohl(*(uint32_t*)(rtcp_info+offset));printf("LastSRtimestamp:0x%x\n",lsr);offset+=4;/*DelaysincelastSRtimestamp*/dlsr=ntohl(*(uint32_t*)(rtcp_info+offset));printf("(%dmilliseconds)\n",(int)(((double)dlsr/(double)65536)*1000.0));offset+=4;counter++;}returnoffset;}constchar*tvb_ntp_fmt_ts_sec(u_char*rtcp_info,intoffset){uint32_ttempstmp=0;time_ttemptime=0;structtm*bd;char*buff=NULL;tempstmp=ntohl(*(uint32_t*)(rtcp_info+offset));if(tempstmp==0){return"NULL";}/*Weneedatemporaryvariableheresotheunsignedmath*workscorrectly(foryears>2036accordingtoRFC2030*chapter3).*/temptime=(time_t)(tempstmp-NTP_BASETIME);bd=gmtime(&temptime);if(!bd){return"Notrepresentable";}buff=(char*)malloc(NTP_TS_SIZE);snprintf(buff,NTP_TS_SIZE,"%s%2d,%d%02d:%02d:%02dUTC",mon_names[bd->tm_mon],bd->tm_mday,bd->tm_year+1900,bd->tm_hour,bd->tm_min,bd->tm_sec);returnbuff;}staticintdissect_rtcp_sr(u_char*rtcp_info,intoffset,intcount,intpacket_length){uint32_tts_msw=0,ts_lsw=0;intsr_offset=offset;/*NTPtimestamp*/ts_msw=ntohl(*(uint32_t*)(rtcp_info+offset));printf("ts_msw:0x%x\n",ts_msw);ts_lsw=ntohl(*(uint32_t*)(rtcp_info+offset+4));printf("ts_lsw:0x%x\n",ts_lsw);//printf("offset:0x%x0x%x0x%x0x%x\n",rtcp_info[offset],rtcp_info[offset+1],rtcp_info[offset+2],rtcp_info[offset+3]);printf("MSW:%s\n",tvb_ntp_fmt_ts_sec(rtcp_info,offset));offset+=8;/*RTPtimestamp,32bits*/offset+=4;/*Sender'spacketcount,32bits*/offset+=4;/*Sender'soctetcount,32bits*/offset+=4;/*TherestofthepacketisequaltotheRRpacket*/if(count!=0)offset=dissect_rtcp_rr(rtcp_info,offset,count,packet_length-(offset-sr_offset));else{/*Iflengthremaining,assumeprofile-specificextensionbytes*/if((offset-sr_offset)<packet_length){offset=sr_offset+packet_length;}}returnoffset;}staticintdissect_rtcp_sdes(u_char*rtcp_info,intoffset,intcount){intchunk=0;intstart_offset=0;intitems_start_offset=0;uint32_tssrc=0;unsignedintitem_len=0;unsignedintsdes_type=0;unsignedintprefix_len=0;chunk=1;while(chunk<=count){/*Createasubtreeforthischunk;wedon'tyetknowthelength.*/start_offset=offset;ssrc=ntohl(*(uint32_t*)(rtcp_info+offset));printf("Chunk%u,SSRC/CSRC0x%X\n",chunk,ssrc);/*SSRC_nsourceidentifier,32bits*/offset+=4;/*CreateasubtreefortheSDESitems;wedon'tyetknowthelength*//**Noteverymessageisendedwith"null"bytes,socheckfor*endofframeaswell.*//*ID,8bits*/sdes_type=rtcp_info[offset];printf("Type:%d\n",sdes_type);if(sdes_type==0)break;offset++;/*Itemlength,8bits*/item
使用rtcp实现音视频同步

音视频同步是指音视频的rtp时间戳同步. audio/video rtp 时间戳不能自己同步,需要audio/video rtcp同步。发送端以一定的频率发送RTCP SR(Sender Report)这个包,SR分为视频SR和音频SR,SR包内包含一个RTP时间戳和对应的NTP时间戳,可以用&lt;ntp,rtp&gt;对做音视频同步.(同步过程在后面) Rtcp sr 格式...

一文看懂音视频流媒体协议及信令技术

流媒体协议分为传输控制报文协议和传输媒体数据协议。传输控制报文协议通常用于协商流媒体通信建立的参数,如SIP、RTSP等协议。传输媒体数据报文通常用于传输音视频媒体数据,如RTP/RTCP/SRTP/SRTCP等协议。此外,也有部分协议将控制信令和媒体信令放在一个连接里传输,如RTMP等协议。SIP(Session Initiation Pro...

流媒体协议RTP、RTSP、RTMP、HLS、SRT、WebRTC全面分析

WebRTC支持网页浏览器的实时通信,信令遵循ICE框架,支持加密和多种编码格式,但不支持H.265。接收视频时,需解协议、格式,然后解码并同步播放。总结来说,RTP/RTCP组合适合IPTV,RTMP适合互联网音视频传输,HLS适合Apple终端,SRT注重低延迟,WebRTC则拓展到更多场景。选择哪种协议,取决于具体的应用需求...

RTP协议发送的音视频数据是封装到一起的,还是分别发送音频和视频?

填充数据是RTP包的尾部,用于填充不足的字节数,不属于Payload部分。在WebRTC的实现中,RTP包的生成和解析通过RtpPacket类进行,接收端通过接收队列处理包的抖动,确保音视频同步。与此同时,RTP的伴侣协议RTCP负责提供控制和统计信息,如数据包计数、丢失和延迟。RTCP报文分为多种类型,如发送报告(SR)、...

超越RFC3550 - RTP/RTCP协议族分析

RF3550定义实时传输协议RTP和它的控制协议RTCP。RTP协议是Internet上针对流媒体传输的基础协议,该协议详细说明在互联网上传输音视频的标准数据包格式。RTP本身只保证实时数据的传输,并不能提供可靠传输、流量控制和拥塞控制等服务质量保证,这需要RTCP协议提供这些服务。 RTCP协议负责流媒体的传输质量保证,提...

RTP/RTCP的1.简介

实时传输协议RTP(Realtime Transport Protocol):是针对Internet上多媒体数据流的一个传输协议, 由IETF(Internet工程任务组)作为RFC1889发布。RTP被定义为在一对一或一对多的传输情况下工作,其目的是提供时间信息和实现流同步。RTP的典型应用建立在UDP(User Datagram Protocol,用户数据包协议)上,但也可以...

流媒体技术基础-流媒体编码与协议

三、编码与解码技术解析&lt;/ 音视频编码的核心在于H.264/AAC,它们提供了高效的压缩,H.264在压缩效果上超越了MPEG-2/MPEG-4。而MPEG1/2/4/AVI/MKV/MP4/FLV等则是广泛应用的格式。视频播放涉及多个步骤:解协议、解封装、解码,以及同步处理,而YUV格式,如YUV420 Plannar和Semi-Planar,展示了不同...

RTP,RTCP,RTSP等网络协议有何用途和区别

1、RTP(Real-timeTransportProtocol)是用于Internet上针对多媒体数据流的一种传输协议。RTP被定义为在一对一或一对多的传输情况下工作。其目的是提供时间信息和实现流同步。但RTP通常使用UDP来传送数据。2、TCP协议是一种典型的有连接协议,而UDP协议则是典型的无连接服务。TCP/IP协议所包括的协议和工具TCP...

WebRTC系列分享 | WebRTC视频QoS全局技术栈

AVSync音视频同步机制通过RTCP报文的NTP时间作为参考,对音视频进行适当缓冲,确保渲染时间一致,实现音视频的同步播放。动态分辨率调整策略根据网络传输质量、CPU占有率与编码质量,动态调整视频传输分辨率,平衡资源与质量需求,提供适应不同网络条件的视频服务。WebRTC在不同网络条件下的QoS策略动态调整,包括...

rtmp, rtsp, webrtc 简单的关系总结

RTSP协议,以客户端方式工作,提供播放、暂停、后退、前进等流媒体操作。RTSP负责控制信息、操作方法、状态码以及与RTP的交互操作。RTSP主要控制实时数据的发送,自身不传输流媒体数据,需要依赖RTP/RTCP协议完成。RTMP,基于TCP,是实时消息传输协议,用于Flash/AIR平台与流媒体/交互服务器之间的音视频数据通信...

声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
我永远都不会离开,除非某一天你不要我了,你我认定了,我要娶你做老婆... 安徽中考志愿 火车2673列9号车厢96号座 五四青年节以梦为马,不负韶华,青年不轻,逐梦有年 中国东海在哪个省 你认为国家安全是什么 广西北流万盛御翠园能上北流实验中学吗 我现在高中,要给我同桌生日祝福,请有文笔的高手给点建议 哪些茶叶最好喝 最好的十种中国茶 上班太耽误搞钱了 为什么我做了仰卧起坐第二天起床腹部肌肉痛 为什么做了仰卧起坐后,肚子会有点痛的感觉?如题 谢谢了 床缝里的小虫子是什么 鱼塘的回填要审批吗 徽州圆子有哪些复杂的做法? 徽州圆子是哪个菜系的名菜 徽州圆子的做法 徽州圆子的做法 洪荒凌霄录内容简介 医院职工公休假要扣工资吗? 燕子没有你我怎么活啊是什么电影 燕子猪头电影叫什么名字 华为p10怎么设置一键返回主屏幕 华为p10返回键怎么设置 抗皱产品排行榜前十名,实力推荐:热门好用的抗皱产品榜单 什么品牌的护肤品紧致又抗皱? 抗皱精华液有哪些品牌啊? 保湿去皱产品排行榜:口碑好的保湿去皱护肤品推荐 美原英是什么 10分钟看懂Photoshop 照片高级处理工具Camera Raw(概述-打开和存储Raw... 【PS知识】图片的常用格式有哪些? 教师节送几朵花合适呢? 打过狂犬疫苗可以吃榨菜吗 打了狂犬疫苗后可以喝果然掂的奶茶吗?然后是不是那一个月都要吃清淡的... 我登我女朋友的探探好,这个号她太久没用了要激活,我激活登入后,他... 如何在国外申请qq号,登录不是问题,只是想给别人再申请一个。国外... 请帮忙注册一个ITUNES 用的帐号!!!是在国外使用的,,但不是美国哦!!万... ...老式电脑不支持WIFI功能如何可以让它连接WIFI上网!谢谢 ...EXCEL里的VBAProject密码,加载一个dll后,在VB编辑器里显示要密码有... 装修家具要放多久可以入住 家具装修需要等多久方可入住 DNF安全公约2.0恶意发言如何处罚? 女孩叫钰汐,钰熙那个好? 突袭3闪电战:适用于哪些游戏平台? 新房子装修完多久才能住 新房装修完后需要多长时间才能入住 新房装修后几个月入住 央视86版《西游记》插曲《天竺少女》中的沙里瓦一词是什么意思?_百度... 如何设立简单的小局域网,加入域要密码,互访文件夹要权限的? 西班牙女人和中国女人,有哪些不同? 民法典物业费是多少 AKG耳机能否插进hp 2230s耳机孔中 未入住的时候物业费的收费标准是多少 刘德华的孩有几个