http://blog.csdn.net/chenliangming/article/details/3616720

引自《广播电视信息》2008年1月

从数字电视前端系统功能上来讲,传统的DVB数字硬件前端技术包含编码、复用、加扰、调制四个基本环节,而在实际的DVB前端系统中还有直接的TS流转发环节,如下图所示:

上图中编码环节是将模拟视音频或者基带的数字视频和音频信号编码形成标准的TS流,而流转发环节是将卫星或者通过其它信道过来的信号转成符合当地标准的TS流,所有的TS进入复用环节进行复用。为了满足运营的需求,TS需要进入加扰环节进行加扰,然后进入调制器进行调制,最后进入本地的HFC网络。

数字电视编解码是按照MPEG标准进行的,而在MPEG标准中,编解码设备在在处理TS流的时候,都有一个基础的时间参考,这个时间参考就是PCR。一般来说,PCR在编码端产生,需要准确的传输到解码端,供解码使用。

一、 PCR在解码端的作用

PCR(program clock reference),中文可以翻译为节目参考时钟,是DVB传输流里面的一个基础时钟。在数字电视传输流里面,PCR是一个分两个部分编码的42位字段,其中33位为PCR基础,9位为PCR扩展。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,不仅仅控制了音频和视频之间的相互同步,同时也控制了音频和视频整体相对于编码输入的延时。

二、 PCR生成

PCR对于视频、音频的质量和相互延时都非常关键。但是TS流在传输过程中,每经过一次设备的处理,由于码率以及TS包之间相互关系的变化,都会对PCR的抖动和间隔产生比较大的影响,从而影响终端的正常解码。在最新的TR101 290标准里面,对PCR的精度、漂移、抖动都有明确的要求。在实际系统中,PCR的生成和校正是最关键的处理要素。

PCR的生成一般是在编码器里面实现。作为整个数字电视的最头端,编码器生成的PCR的质量对后端有着至关重要的作用,实际上,后端无论是采用何种校正方式,PCR的精度肯定会低于编码器发出的PCR。所以,对于编码器来讲,PCR要求的精度应该非常高。

对于编码器来讲,要生成精度高的PCR,首先要有一个非常精准的系统时钟(27M),要保证这个时钟随时间和温度的漂移都非常小,其次,也要有一个合理的PCR生成策略。在编码器内部,在DVB系统里面,PCR是针对27M时钟产生的, ASI发出的时钟也是27M,这两个时钟要采取采用同源处理。从实现方式上,编码器内部维护一个PCR的计数器,以这个计数器为时间,计算PCR发送的间隔(DVB要求每40ms必须有一个PCR),然后在发送PCR字节的同时,锁定PCR计数器的数值,这样就可以保证PCR发送的无抖动。同时,这个计数器还要针对于视频的输入和音频的输入,对编码器发出的视音频的PTS(DTS)进行处理,以保证唇音同步。

三、 PCR校正

Pm PCR2

Pn PCR1

P1

P2

Pm+1

如图所示是一个正常传输的TS流示意图,其中P1,P2,…,Pm是指TS包。其中Pn带有PCR1,Pm携带有PCR2。在判断PCR的时候,有两个比较关键的时间参数,分别是PCR2和PCR1两个数值的差Pd以及PCR2的到达时间Tpcr2和PCR1的到达时间Tpcr1之差Pi,其中

Pd =PCR2 - PCR1;

Pi = Tpcr2-Tpcr1;

其中,Pi我们可以看做是一个客观时间,而Pa=Pd-Pi就是PCR的精度相对于客观时间的偏移。如果在编码器内部,系统处理得当的话,Pa应该非常小,如果不考虑编码器的时钟相对于客观时间的偏移,Pa是有可能等于0的

TS流从编码器发出之后,进入复用器、适配器、调制器等环节,码流就有了两个基本的变化,首先是码率发生了变化,其次以前的码流的相互关系被打乱,虽然每一个PID的包的顺序不可能发生变化,但是不同的PID发生交错,则整个包的顺序就发生了很大的变化。

Pm’ PCR2

Pn’ PCR1

P1

P2

Pm+1

如图所示,在新生成的TS包中,携带PCR的两个TS包的相对顺序已经发生了变化,分别为Pn’和Pm’,若两个PCR的值没有发生变化,那么PCR2和PCR1两个数值Pd的差不变,而PCR2的发出时间Tpcr2’和PCR1的到达时间Tpcr1’之差Pi’则发生了变化

DVB系统中PCR的生成和PCR校正的更多相关文章

  1. (转)秒杀系统中如何动态生成下单随机URL

    秒杀系统中通常会避免用户之间访问下单页面的URL(避免使用爬虫来造成不公平).所有需要将URL动态化,即使秒杀系统的开发人员也无法在知晓在秒杀开始时的URL.解决办法是在获取秒杀URL的接口中,返回一 ...

  2. <linux系统c语言生成.so文件,生成64位可执行文件,在64位系统中运行32位的可执行文件>

    1.linux 系统c语言生成.o文件,---->gcc -m64 -c -fPIC test.c -o test.o2.linux 系统c语言生成.so文件,----->gcc -sha ...

  3. 有意思的RTL函数RegisterClass(在持久化中,你生成的一个新类的对象,系统并不知道他是如何来的,因此需要你注册)good

    例子1:Delphi中使用纯正的面向对象方法(这个例子最直接) Delphi的VCL技术使很多程序员能够非常快速的入门:程序员门只要简单的拖动再加上少量的几个Pascal语句,呵呵,一个可以运行得非常 ...

  4. 使用Kali中的Metasploit生成木马控制Windows系统 (第九天 9.20)

    本文转自:https://www.cnblogs.com/yankaohaitaiwei/p/11556921.html 一.kali及Metasploit kali基于debin的数字取证系统,上面 ...

  5. 架构设计 | 分布式业务系统中,全局ID生成策略

    本文源码:GitHub·点这里 || GitEE·点这里 一.全局ID简介 在实际的开发中,几乎所有的业务场景产生的数据,都需要一个唯一ID作为核心标识,用来流程化管理.比如常见的: 订单:order ...

  6. DVB-C系统中QAM调制与解调仿真

    本文简单记录一下自己学习<通信原理>的时候调试的一个仿真DVB-C(Cable,数字有线电视)系统中QAM调制和解调的程序.自己一直是研究"信源"方面的东西,所以对&q ...

  7. Linux 系统中堆栈的使用方法

    本节内容概要描述了Linux内核从开机引导到系统正常运行过程中对堆栈的使用方式.这部分内容的说明与内核代码关系比较密切,可以先跳过.在开始阅读相应代码时再回来仔细研究. Linux 0.12系统中共使 ...

  8. MachineKey 操作 之 应用集群中SSO应用生成MachineKey

    MachineKey介绍 MachineKey其用于对 Forms 身份验证 Cookie 数据和视图状态数据进行加密和解密,一般情况下IIS自动默认给网站或者每一个应用生成唯一的MachineKey ...

  9. UEFI+GPT模式下的Windows系统中分区结构和默认分区大小及硬盘整数分区研究

    内容摘要:本文主要讨论和分析在UEFI+GPT模式下的Windows系统(主要是最新的Win10X64)中默认的分区结构和默认的分区大小,硬盘整数分区.4K对齐.起始扇区.恢复分区.ESP分区.MSR ...

随机推荐

  1. C#--格式化数值数据

    如果数值数据需要更精细的格式化,每一个占位符都可以包含不同的格式字符,下表展示了核心格式化选项.   下面用一个例子来说明. namespace LearningCSharp { class Prog ...

  2. javascript笔记—— call 简单理解

    call 方法 请参阅 应用于:Function 对象 要求 版本 5.5 调用一个对象的一个方法,以另一个对象替换当前对象. call([thisObj[,arg1[, arg2[, [,.argN ...

  3. Windows7下安装搭建play框架

    作者:Sungeek 出处:http://www.cnblogs.com/Sungeek/ 欢迎转载,也请保留这段声明.谢谢! 1.首先官网下载play的解压包 https://playframewo ...

  4. PERL 脚本

    PERL: Practical Extraction and Report Language 参考文档 1.Perl 5 version 24.0 documentation

  5. Google的小秘密

      google有计算器的功能,例如在google中搜索25*25.lg(13)等,看会出现什么样的结果. http://www.google.com/microsoft  微软风格的入口 http: ...

  6. BroadcastReceiver

    BroadcastReceiver 广播接受者 Android中, Broadcast是一种数据传递的方式/通信方式. Brodadcast 是Android 系统组件之一 广播的特性 1. 由一个发 ...

  7. php总结:1.php介绍

    1.什么是php PHP,即“Hypertext Preprocessor”,是一种被广泛应用的开源通用脚本语言,尤其适用于 Web 开发并可嵌入 HTML 中去.它的语法利用了 C.Java 和 P ...

  8. AVL树的python实现

    AVL树是带有平衡条件的二叉查找树,一般要求每个节点的左子树和右子树的高度最多差1(空树的高度定义为-1). 在高度为h的AVL树中,最少的节点数S(h)由S(h)=S(h-1)+S(h-2)+1得出 ...

  9. Python urllib2多进程共享cookies

    如果想多个进程共享同一个cookies,不用每个进程都重新登录,可以就cookies保存到一个文件,然后多个进程直接共享一个锁来实现 1.一个进程登录完成后,把cookies保存到一个文件里面 sel ...

  10. 编译Linux系统下的jrtplib3.9和jthread1.3(arm和ubuntu)

    最近由于学习需要,需要编译jrtplib,网上的资料基本上都是关于3.9以前的版本,而以前的版本基本上都是通过confiugre来配置生成Makefile,而最近的版本却没有这一项,而是使用cmake ...