一、引言

MPEG-2系统用于视音频同步以及系统时钟恢复的时间标签分别在ES,PES和TS这3个层次中。在ES层,与同步有关的主要是视频缓冲验证VBV(Video Buffer Verifier),用以防止解码器的缓冲器出现上溢或者下溢;在PES层,主要是在PES头信息里出现的显示时间标签PTS(Presentation Time Stamp)和解码时间标签DTS(Decoding Time Stamp);在TS层中,TS头信息包含了节目时钟参考PCR(Program Clock Reference),用于恢复出与编码端一致的系统时序时钟STC(System Time Clock)。在节目流PS包头中加入SCR,它的作用与PCR域相似。标准规定在原始音频和视频流中,PTS的间隔不能超过0.7s,而出现在TS包头的PCR间隔不能超过0.1s。

我们知道,MPEG-2对视频的压缩产生I帧、P帧、B帧。把帧顺序I1帧-P4帧-B2帧-B3帧-P7帧-B5帧-B6帧的编码ES,通过打包并在每个帧中插入PTS/DTS标志,变成PES。在插入PTS/DTS标志时,由于在B帧PTS和DTS是相等的,所以无须在B帧多插入DTS(参见图1)。而对于I帧和P帧,由于经过复用后数据包的顺序会发生变化,显示前一定要存储于视频解码器的从新排序缓存器中,经过从新排序后再显示,所以一定要同时插入PTS和DTS作为从新排序的依据。

二、同步机制

编码器中有一个系统时钟STC(其频率是27MHz),此时钟用来产生指示音视频的正确显示和解码的时间标签,同时可用来指示在采样过程中系统时钟本身的瞬时值。指示音视频显示时间的时间标签称为显示时间标签(PTS),指示音视频的解码时间标签称为解码时间标签(DTS),指示系统时钟本身的瞬时值的时间标签称为节目参考时钟标签(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的原理图。

图2 用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相等时开始显示。

三、失同步处理

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相等时,就可显示/解码。

PTS PCR DTS 详解的更多相关文章

  1. Linux DTS(Device Tree Source)设备树详解之二(dts匹配及发挥作用的流程篇)【转】

    转自:https://blog.csdn.net/radianceblau/article/details/74722395 版权声明:本文为博主原创文章,未经博主允许不得转载.如本文对您有帮助,欢迎 ...

  2. Linux dts 设备树详解(二) 动手编写设备树dts

    Linux dts 设备树详解(一) 基础知识 Linux dts 设备树详解(二) 动手编写设备树dts 文章目录 前言 硬件结构 设备树dts文件 前言 在简单了解概念之后,我们可以开始尝试写一个 ...

  3. Linux dts 设备树详解(一) 基础知识

    Linux dts 设备树详解(一) 基础知识 Linux dts 设备树详解(二) 动手编写设备树dts 文章目录 1 前言 2 概念 2.1 什么是设备树 dts(device tree)? 2. ...

  4. [视频播放] HLS协议之M3U8、TS流详解

    本文转载自:<hls之m3u8.ts流格式详解> HLS,Http Live Streaming 是由Apple公司定义的用于实时流传输的协议,HLS基于HTTP协议实现,传输内容包括两部 ...

  5. SRS之SrsHls::on_audio详解

    1. SrsHls::on_audio 将音频数据封装到 ts 文件中. /* * mux the audio packet to ts. * @param shared_audio, directl ...

  6. SRS之SrsHls::on_video详解

    1. SrsHls::on_video /* * mux the video packets to ts. * @param shared_video, directly ptr, copy it i ...

  7. FFmpeg编解码处理2-编解码API详解

    本文为作者原创,转载请注明出处:https://www.cnblogs.com/leisure_chn/p/10584925.html FFmpeg编解码处理系列笔记: [0]. FFmpeg时间戳详 ...

  8. FFmpeg时间戳详解

    本文为作者原创,转载请注明出处:https://www.cnblogs.com/leisure_chn/p/10584910.html 1. I帧/P帧/B帧 I帧:I帧(Intra-coded pi ...

  9. (3)lscpu详解 (每周一个linux命令系列)

    (3)lscpu详解 (每周一个linux命令系列) linux命令 lscpu详解 引言:今天的命令是用来看cpu信息的lscpu lscpu 我们先看man lscpu display infor ...

随机推荐

  1. 推荐一个linux下的web压力测试工具神器webbench

    推荐一个linux下的web压力测试工具神器webbench2014-04-30 09:35:29   来源:   评论:0 点击:880 用多了apache的ab工具之后你就会发现ab存在很多问题, ...

  2. PHP日期格式转时间戳

    PHP 提供了函数可以方便的将各种形式的日期转换为时间戳,该类函数主要是: strtotime():将任何英文文本的日期时间描述解析为时间戳. mktime():从日期取得时间戳. strtotime ...

  3. 获取网页文档的URL和连接来源

    <script type="text/javascript">document.write("链接来源:"+document.referrer+&q ...

  4. UML 序列图一点理解

    激活状态,就是长方形该画到哪里呢?我的理解是,一个长方形代表调用函数的执行过程,比如下图 这个长方形就表示viewDidAppear()函数没有执行完,在这个长方形上发出或者收到的消息都是在 view ...

  5. linux 多个文件中查找字符串

    2015年2月9日 14:36:38 # find <directory> -type f -name "*.c" | xargs grep "<str ...

  6. (转)SQL SERVER的锁机制(一)——概述(锁的种类与范围)

    锁定:通俗的讲就是加锁.锁定是 Microsoft SQL Server 数据库引擎用来同步多个用户同时对同一个数据块的访问的一种机制. 定义:当有事务操作时,数据库引擎会要求不同类型的锁定,如相关数 ...

  7. 升级Windows10后Apache服务器启动失败的解决方法

    升级windows10系统后,微软内置了ASP.NET的web高级服务,默认安装了IIS服务器和MSSQL数据库,因为80端口被占用的原因,导致Apache服务器无法正常启动,但是MySQL服务一切正 ...

  8. [杂]SQL Server 之命名管道连接

    命名管道是通过进程间通信(IPC)机制实现通信.具体来说,命名管道建立在服务器的IPC$共享基础上,通过IPC$共享来进行通信. SQL Server命名管道 SQL Server 首先在服务器上创建 ...

  9. hdu 1150 最小点覆盖

    题目大意;有两台机器A和B以及N个需要运行的任务.每台机器有M种不同的模式,而每个任务都恰好在一台机器上运行.如果它在机器A上运行,则机器A需要设置为模式xi,如果它在机器B上运行,则机器A需要设置为 ...

  10. Android开发规范——命名 (转)

    转自: http://blog.sina.com.cn/s/blog_3f5dd7810101j4u2.html 在讲解命名规范前,先初略介绍下当前主要的标识符命名法和英文缩写规则. 标识符命名法 标 ...