音视频同步:
在编码器中有一个单一的公用系统时钟,该时钟用于创建指出音频和视频的正确的显示和解码时间的时间标记,也用于创建指出在采样间隔时系统时钟瞬时值的时间标记。
指出音频和视频显示时间的时间成为显示时间标记(PTS),
指出解码时间的成为解码时间标记(DTS)(DTS和PTS的时间间隔在0.1s)。
而指出系统时钟值的在节目流中称为系统时钟参考(SCR),在传输流中成为节目时钟参考(PCR)。
正是编码器中的公用系统时钟和由它所创建的时间标记,以及解码器中重新生成的时间和时间戳的正确使用,才提供可恰当地同步解码器操作的措施。
同步是实现电视正确显示的必要条件。对数字电视来说,由于在压缩编码过程中,利用缓存器对信号存储,复用器中信号的时间轴是变动的,加上数据冗余量大小的不同,压缩比也不同,因此时间轴变动很大,尤其是在帧组层处理中,B帧和P帧的顺序也发生了变化。所有这些,使得数字电视信号的同步,完全失去了原来序列的概念。实现同步的有效办法,就是在信号码流中,每经过一个规定的间隔加入一个时间标签。有了这个标签,就可以在接收端在显示之前的解码过程中,根据这个时间标签进行重新排序,重建在压缩编码之前图像的顺序,以及声音和图像之间的时间关系,从而实现图像同步及声音与图像同步。
在数字电视系统的前端编码器中有一个27Mhz的时钟编码过程中不断读取该时钟信息,填入PES包的PTS、DTS字段和TS包的PCR字段,数字电视系统的终端(机顶盒)中也有一个27Mhz的时钟,机顶盒将接收到的PES包中的PTS和DTS和该时钟进行比较,来决定是解码还是显示的操作。如果前端编码器的时钟与后端机顶盒中时钟"绝对"同步,那么TS 中的PCR 就没有任何意义了。
为什么还需要PCR?因为如果不进行时钟锁定,终端解码器的时钟频率 f2 和编码器的时钟 f1 之间存在微小误差,经过长时间的累积,机顶盒中解码器会因为自己时钟过快而造成缓存中没有数据,导致停帧,也会因为时钟过慢造成缓存中数据溢出,导致丢帧。
原理如图:
PCR在解码端的作用:
PCR(program clock reference 节目参考时钟),是DVB传输流里面的一个基础时钟。在数字电视传输流里面,PCR是一个分两个部分编码的42位字段,其中33位为PCR基础(Program_clock_reference_base),9位为PCR扩展(Program_clock_reference_extension)。PCR扩展以300为模进行计数,取模一次PCR基础加1,所有的计数都是以本地的基础27M时钟进行。
作为数字电视流传输过程中的时钟基准,PCR在解码端有两个非常关键的作用:
一是同步头端和终端的27M时钟,并借此同步头端和终端的色度平衡和帧率。在数字电视终端设备上,都有一个压控振荡器和一个内部的计数器,这个内部的计数器会对本地压控振荡器的时钟进行计数,并且和TS流内部的PCR数字进行比较,若本地计数器的变化率高于PCR的变化率,表征本地的27M时钟比头端27M时钟快,应该调整压控振荡器的电压,降低压控振荡器的频率;反之则提高本地振荡器的振荡频率。
在PES层里面,还有一对时间信息,那就是DTS和PTS。其中DTS为解码时间标签,PTS为显示时间标签。对于视频数据来讲,针对于不同IPB类型解码时间和显示时间的关系是不同的,B帧的PTS和DTS相同,所以只有PTS;而对于音频数据来讲,由于音频的传输是严格按照顺序传输的,所以音频没有DTS,只有PTS。但是DTS、PTS和PCR的相互作用原理是一样的,都是为了在正确的时间对数据进行解码和显示,从而达到音频和视频相对于系统时间的同步,也在客观上实现了音频和视频之间的同步。在实际实现中,终端里面会维护另外一个计数器DTS_Base,DTS_Base的值会被PCR重置,同时随着本地时钟进行递加,当遇到音频(视频)帧头时,会记录当前帧的DTS(PTS),DTS和DTS_Base的差在一定范围之内时,携带此DTS的那一帧就会被送进解码单元进行解码。在数字电视终端采用PCR主同步模式解码时,视频和音频分别按照自己的DTS(PTS)和本地时间的关系进行解码,前端合理的配置DTS(PTS)和PCR,不仅仅控制了音频和视频之间的相互同步,同时也控制了音频和视频整体相对于编码输入的延时。
同步:
解码器通过VBV_delay(视频流延时值,在解码时利用视频流缓冲区把视频流缓存到相应的vbv_delay时间后,再启动解码器解码、显示、实现音视频的同步。vbv_delay存在于视频ES的头部,长度为16bit)的数值来确定解码的开始,用解码时间标签(DTS)和显示时间标签(PTS)来确定解码和显示的次序,用PCR来获得系统时钟的同步。解码器中的系统时钟及其同步就是依靠这些时间标签来进行恢复和修正的。
PCR的插入必须在PCR字段的最后离开复用器的那一时刻,同时把27MHz系统时钟的采样瞬时值作为PCR字段插入到相应的PCR域。是放在TS包头的自适应区中传送。27 MHz时钟经波形整理后分两路,一路是由27MHz脉冲直接触发计数器生成扩展域PCR_ext,长度为9bits。另一路经一个300分频器后的90 kHz脉冲送入一个33位计数器生成90KHZ基值,列入PCR_base(基值域),长度33bits,用于和PTS/DTS比较,产生解码和显示所需要的同步信号。这两部分被置入PCR域,共同组成了42位的PCR。
PTS域为33bits,它也是一个33b的计数值,也是对系统时钟的300分频的时钟的计数值。被编码成为3个独立的字段,表示此分组中第一个访问单元在系统目标解码器中的预定显示时间。
DTS域也为33bits,编码成为3个独立的字段,表示此分组中第一个访问单元在系统目标解码器中的预定解码时间。DTS就视频来说,因为视频编码的时候用到了双向预测,一个图像单元被解出,并非马上就被显示,可能在存储器中留一段时间,作为其余图像单元的解码参考,在被参考完毕后,才被显示。针对视频的显示,Mpeg还提出了一个视频PTS。针对音频和视频的同步显示,又提出了一个音频PTS。由于声音没有用到双向预测,它的解码次序就是它的显示次序,故对它只提出PTS的概念。
解码器在解码时,首先利用PCR重建和编码器同步的27 MHz系统时钟,恢复27 MHz系统时钟后,再利用PES流中的DTS,PTS进行音频与视频间的同步,同时利用VBV_Delay设置解码器的缓冲时长,后启动初始解码。下图是利用PCR恢复STC的原理图。
PCR-Base的作用是在解码器切换节目时,提供对解码器PCR计数器的初始值,以让该PCR值与PTS、DTS最大可能地达到相同的时间起点。PCR-ext的作用是通过解码器端的锁相环电路修正解码器的系统时钟,使其达到和编码器一致的27MHz。
在PCR域的33 bits中的90 kHz部分(即PCR-Base域)用于与PTS和DTS作比较,当二者相同时,相应的单元被显示或者解码。但按照MPEG-2标准的规定,PTS/DTS位于PES包的包头中,而解复用器所解出的PES包头的字节不被送入到任何基本流解码器的输入缓冲区,仅用于控制各解码器工作。每当解复用器解到一个PTS/DTS时,PTS/DTS就作为其后送入各个基本流解码器的输入缓冲器中的数据的显示/解码时间,但此时送入信道缓冲器中的基本流并不一定立即被解码,因此基本流解码器必须记录当前这个PTS/DTS及所对应的码流位置,以利于后面的解码和显示同步。
针对以上分析,我们采用如下方法来达到解码与显示的同步:在每一个基本流解码器中建立一个33 bits的PTS/DTS先入先出存储器(FIFO),用以存放PTS/DTS值,同时在解复用器中加入一个检测电路,每当码流开始新的一帧图像时,则产生一个信号,用来通知基本流解码器,并将该帧图像的PTS/DTS写入到FIFO中。每当解码器解到一帧图像时,就从FIFO中读出相应的PTS/DTS,此PTS/DTS与STC进行比较,当两者相等时,当前图像就开始显示/解码。
在MPEG-2标准中,并非每一个PES包或每一帧图像均有PTS和DTS,一般PS流中每两个PTS之间的间隔是0.7 s,而TS流中每两个PTS之间的间隔是0.1 s,所以在没有PTS和DTS的一帧图像出现时,我们可以在前一PTS/DTS的基础上加一增量得到对应该帧图像的PTS/DTS,并将计算出来的新的PTS/DTS插入到存放PTS/DTS的FIFO中去,即:PTSn=PTSn-1+ΔPTS(n为第n帧图像)。
解码器同步算法总结如下:
(1)解码器从输入码流的包头中解出时间信息PCR送入到系统时间时钟恢复电路;系统时间时钟恢复电路在接收到每一个新的PCR时,进行本地系统时间时钟恢复和锁相。
(2)解复用器后,从PES包头中解出显示时间标签PTS和解码时间标签DTS,并送入到基本流解码器中。
(3)基本流解码器在接收到新的PTS/DTS后,存入对应的FIFO(先进先处存储器)中进行管理;对于没有PTS/DTS的显示单元,需要对其时间标签进行插值,并送入到FIFO中管理。
(4)每一显示单元开始解码前,用其对应的DTS与STC进行比较,当STC与DTS相等时开始解码;
(5)每一显示单元开始显示前,用其对应的PTS与STC进行比较,当STC与PTS相等时开始显示。
2。失同步处理
27 MHz系统时钟经过300分频后,得到本地的33 bits PCR_Base,该时钟与寄存器中当前图像的PTS/DTS进行比较,系统软件根据比较结果做出相应的处理:
(1)若当前的PTS/DTS比PCR计数器的值小于半帧以上,即PTS_Base≤-ΔPTS/2,此时说明系统解码过慢,解码器处于失步状态,应根据该帧的结构做出相应的同步调整;
(2)若当前的PTS/DTS比PCR计数器的值在半帧时间以内,我们认为此时系统解码正常,立即显示/解码当前帧;
(3)若当前的PTS/DTS大于PCR计数器的值,则此时解码器稍快,在这种情况下,只需等到PCR与PTS/DTS相等时,就可显示/解码。
参考
1. 数字电视业务信息及其编码
2. ISO/IEC 13818.1 系统