学习笔记:RTP/RTCP的音视频同步原理总结

参考文章::https://blog.csdn.net/lincaig/article/details/81209895 https://www.cnblogs.com/x_wukong/p/5876645.html

https://blog.csdn.net/wxl1986622/article/details/52758022?utm_medium=distribute.pc_relevant.none-task-blog-BlogCommendFromBaidu-1&depth_1-utm_source=distribute.pc_relevant.none-task-blog-BlogCommendFromBaidu-1

音视频媒体间同步是多媒体系统服务质量(QoS)研究中的一项重要内容。在网络上传输多媒体数据时,由于终端对数据的处理方式,以及网络中的延时、抖动,会引起音视频流的不同步。

同步是多媒体通信的主要特征,也是其重要研究内容之一,同步与否直接影响多媒体通信的质量。

一般来说,音视频同步就是视频同步到音频。视频在渲染的时候,每一帧视频根据与音频的时间戳对比,来调整立即渲染还是延迟渲染。比如有一个音频序列,他们的时间戳是A(0, 20, 40, 60,80,100, 120...),视频序列V(0, 40, 80, 120...)。音画同步的步骤如下:

1)取一帧音频A(0),播放。取一帧视频V(0),视频帧时间戳与音频相等,视频立即渲染。

2)取一帧音频A(20),播放。取一帧视频V(40),视频帧时间戳大于音频,视频太早,需要等待。

3)取一帧音频A(40),播放。取出视频,还是上面的V(40),视频帧时间戳与音频相等(真实场景中不一定完全相等,他们之间差值的绝对值在一个帧间隔时间内也可以认为是相同的时间戳),视频立即渲染。

媒体间同步即是要保持音频流和视频流之间的时间关系。为了描述同步,实现相关的控制机制,定义了相应的服务质量参数(QoS)。针对音视频,采用时间差即偏差来表示。结果表明,如果偏差限制在一定的范围内,认为媒体是同步的。当偏移在-90ms(音频滞后于视频)到+20ms(音频超前视频)之间时,人感觉不到试听质量的变化,这个区域可以认为是同步区域;当偏移在-185到+90之外时,音频和视频会出现严重的不同步现象,此区域认为是不同步区域。

对于视频播放器和实时视频,他们的同步原理如上面描述的一样,逃不开时间戳的对齐,只是在实现的时候可能有些差异。

   

RTP 的时间戳.

    首先,了解几个基本概念:

    时间戳单位:时间戳计算的单位不是秒之类的单位,而是由采样频率所代替的单位,这样做的目的就是 为了是时间戳单位更为精准。比如说一个音频的采样频率为8000Hz,那么我们可以把时间戳单位设为1 / 8000。
    时间戳增量:相邻两个RTP包之间的时间差(以时间 戳单位为基准)。
    采样频率:  每秒钟抽取样本的次数,例如音频的采样率一般为8000Hz
    帧率:      每秒传输或者显示帧数,例如25f/s

RTP包头的第2个32Bit即为RTP包的时间戳,Time Stamp ,占32位。
    时间戳反映了RTP分组中的数据的第一个字节的采样时刻。在一次会话开始时的时间戳初值也是随机选择的。即使是没有信号发送时,时间戳的数值也要随时间不 断的增加。接收端使用时间戳可准确知道应当在什么时间还原哪一个数据块,从而消除传输中的抖动。时间戳还可用来使视频应用中声音和图像同步。
    在RTP协议中并没有规定时间戳的粒度,这取决于有效载荷的类型。因此RTP的时间戳又称为媒体时间戳,以强调这种时间戳的粒度取决于信号的类型。例如, 对于8kHz采样的话音信号,若每隔20ms构成一个数据块,则一个数据块中包含有160个样本(0.02×8000=160)。因此每发送一个RTP分 组,其时间戳的值就增加160。

  首先,时间戳就是一个值,用来反映某个数据块的产生(采集)时间点的, 后采集的数据块的时间戳肯定是大于先采集的数据块的。有了这样一个时间戳,就可以标记数据块的先后顺序。
    第二,在实时流传输中,数据采集后立刻传递到RTP 模块进行发送,那么,其实,数据块的采集时间戳就直接作为RTP包的时间戳。
    第三,如果用RTP来传输固定的文件,则这个时间戳 就是读文件的时间点,依次递增。这个不再我们当前的讨论范围内,暂时不考虑。
    第四,时间戳的单位采用的是采样频率的倒数,例如采 样频率为8000Hz时,时间戳的单位为1 / 8000 ,在Jrtplib库中,有设置时间戳单位的函数接口,而ORTP库中根据负载类型直接给定了时间戳的单位(音频负载1/8000,视频负载1 /90000)
    第五,时间戳增量是指两个RTP包之间的时间间隔, 详细点说,就是发送第二个RTP包相距发送第一个RTP包时的时间间隔(单位是时间戳单位)。
    如果采样频率为90000Hz,则由上面讨论可知,时间戳单位为1/90000,我们就假设1s钟被划分了90000个时间块,那么,如果每秒发送25 帧,那么,每一个帧的发送占多少个时间块呢?当然是 90000/25 = 3600。因此,我们根据定义“时间戳增量是发送第二个RTP包相距发送第一个RTP包时的时间间隔”,故时间戳增量应该为3600。

    多媒体通信同步方法,主要有时间戳同步法、同步标记法、多路复用同步法三种。下面主要讨论时间戳同步法,特别是RTP时间戳同步。内容包括RTP媒 体间同步的实现,为什么需要RTCP的NTP时间来实现媒体间同步?没有RTCP,能实现RTP媒体间的同步吗?

     根据RTP规范,不同的RTP媒体流是分开传输的,且使用各自独立的时间戳进行同步。假设在一次视频点播中,传输两路RTP媒体流,一路视频,一 路音频。根据视频帧时间戳,可以实现视频流内同步,这很好理解,通过视频帧时间戳可以计算出相邻视频帧的时间间隔,也就是视频帧之间的相对时间关系很容易 通过时间戳来确定,按照这个间隔去呈现视频,就可以获得较好的效果。同理,音频流也可以实现自身的同步。 

     仅仅使用RTP时间戳是无法实现媒体间同步的,根本的原因是音频时间轴和视频时间轴是完全独立的,通过音频帧和视频帧的时间戳,无法确定一个视频帧和一个音频帧的相对时间关系,也就是无法把它们都准确定位在绝对时间轴上,只能准确定位一个。

     

       总结:在采用RTP协议进行媒体控制传输时,音频和视频作为不同的会话传输出去了,但他们在RTP层没有直接的关联。RTP包头携带的时间戳信息的基点(起始时间)可能是任意时间。所以,时间戳的信息只能在同一个音频或视频会话内,确定收到的RTP包的时间先后的相对顺序;但该时间戳信息无法确定不同媒体会话之间的时间关系。基于此,需要应用层去实现音视频同步的方案。

    

RTCP控制参数

        由于音视频流作为不同的RTP会话传送,它们在RTP层无直接关联。尽管由一个数据源发出的不同的流具有不同的同步源标识(SSRC),为能进行流同步,RTCP要求发送方给接收方传送一个唯一的标识数据源的规范名(canonical name),应用层藉此关联音视频流,以便实现同步。
      RTP/ RTCP中有时间戳(相对和绝对)和序列号等信息,可以利用它实现基于时间戳的多媒体流同步。使用相对时间戳和序列号实现流内同步;使用相对和绝对时间戳的对应关系实现流间同步。获得相对与绝对时间戳的算法如下:

while ((pack = GetNextPacket()) != NULL)
         {
              if(srcdat->SR_HasInfo() && srcdat->SR_GetRTPTimestamp() != app->mvideortcprtp)  
                   {  
                            app->mvideortcprtp = srcdat->SR_GetRTPTimestamp();
                            app->mvideortcpntp = srcdat->SR_GetNTPTimestamp().GetMSW();
                            srcdat->FlushPackets();  
                   }
                   DeletePacket(pack);
}

 

音视频流间同步实现
        发送端在发送音视频数据时,同时也会发送SR包,这样可以使接收方能够正确使音视频同步播放。

       要实现RTP媒体间同步,需要借助于RTCP,在RTCP的SR包中,包含有<NTP时间,RTP时间戳>对,音频帧RTP时间戳和视频帧RTP时间戳通过<NTP时间,RTP时间戳>对,都可以准确定位到绝对时间轴NTP上,音频帧和视频帧的相对时间关系就可以确定下来 了。

具体实现方法是在接收方每次接收数据包后,再遍历一次数据源,获取所有源端的SS_RTPTime与SS_NTPTime这两则数据,通过获取音频端与视频端的数据,可以利用下面的公式进行计算。
   表 2.1    变量描述表

  1. 类型  RTP数据     NTP数据    RTP时戳频率

  2. 音频 Audio_SRRTPTime Audio_SRNTPTime Audio_Fre

  3. 视频 Video_SRRTPTime Video_SRNTPTime Video_Fre

      从SR包中可以读出音频与视频的RTP与NTP数据,而需要计算的是时戳频率,利用下述公式:

  1. Audio_Fre=( AudioSRRTPtime2- AudioSRRTPtime1)/( AudioSRNTPtime2- AudioSRNTPtime1)

  2. Video_Fre=( VideoSRRTPtime2- VideoSRRTPtime1)/( VideoSRNTPtime2- Video SRNTPtime1)

      以AUDIO为基准,在某个Audio_SRNTP时刻,对应的视频RTP的时间可以这样计算出来:

                      Video_RTPTime=Video_SRRTPTime + (Audio_SRNTP-Video_SRNTP)×Video_Fre

对于任何播放时刻,我们都是以Audio作为主轴,假设AUDIO的播放时间为PLAY_AUDIO_TIME,视频的播放时间为PLAY_VIDEO_TIME,那么:

(PLAY_VIDEO_TIME-Video_RTPTime)/Video_Fre=PLAY_AUDIO_TIME-AudioSRRTPtime)/Audio_Fre

由以上公式可以看出,当音频播放时,我们可以算出此时应该播放的视频的RTP time,如果该视频的时间滞后后音频的时间(根据阈值设定),那么视频不播放,等待;否则应 立刻播放。

 

 

   
 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值