DVB系统中PCR的生成和PCR校正

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’则发生了变化

时间: 2024-11-03 21:35:37

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

系统中生成编号/单号问题的实现方案讨论

应用场景 场景:对于大多数电商系统或财务系统来说,系统中的单号一般都不是从1开始的自增数字,而是一串有一定意义的字符串序列. 而往往这样的单号是要全局唯一的,不可重复. 那么,每次新增订单记录时,这个单号就要按照指定的规则来生成. 常见的订单号规则是字母前缀+日期+时间+定长的数字,如DD201610201559060001(format:XXYYYYMMDDHHmmssNNNN),PZ16102015000012(format:XXYYMMDDHHNNNNNN) 常见方案... 实现这样的场景

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

本文简单记录一下自己学习<通信原理>的时候调试的一个仿真DVB-C(Cable,数字有线电视)系统中QAM调制和解调的程序.自己一直是研究"信源"方面的东西,所以对"信道"这方面的知识进行实践的机会一直不是很多,做这个小程序的过程中也熟悉了不少相关的知识.在这个程序中,每执行一步操作,都会画出时域信号图和频域信号图,同时会在控制台打印出有关变量的取值,对于理解QAM调制与解调有一定的帮助. 一.DVB-C中QAM的调制与解调 简单介绍DVB-C系统中的Q

LINUX系统中动态链接库的创建与使用{补充}

大家都知道,在WINDOWS系统中有很多的动态链接库(以.DLL为后缀的文件,DLL即Dynamic Link Library).这种动态链接库,和静态函数库不同,它里面的函数并不是执行程序本身的一部分,而是根据执行程序需要按需装入,同时其执行代码可在多个执行程序间共享,节省了空间,提高了效率,具备很高的灵活性,得到越来越多程序员和用户的青睐.那么,在LINUX系统中有无这样的函数库呢? 答案是肯定的,LINUX的动态链接库不仅有,而且为数不少.在/lib目录下,就有许多以.so作后缀的文件,这

linux内核探索之内存管理(二):linux系统中的内存组织--结点、内存域和页帧

本文主要参考<深入linux内核架构>(3.2节)及Linux3.18.3内核源码 概述:本文主要描述了内存管理相关的数据结构:结点pg_data_t.内存域struct zone以及页帧(物理页):struct page ,以及该结构相关的一些基本概念. 1. 概述 内存划分为接点,每个结点关联到系统中的一个处理器,在内核中表示为pg_data_t. 各个结点又划分为内存域,比如DMA内存域,高端内存域,普通内存域. 内核内存域的宏: enum zone_type { #ifdef CONF

Linux系统中“动态库”和“静态库”那点事儿 /etc/ld.so.conf 动态库的后缀为*.so 静态库的后缀为 libxxx.a ldconfig 目录名

Linux系统中“动态库”和“静态库”那点事儿 /etc/ld.so.conf  动态库的后缀为*.so  静态库的后缀为 libxxx.a   ldconfig   目录名 转载自:http://blog.chinaunix.net/uid-23069658-id-3142046.html 今天我们主要来说说Linux系统下基于动态库(.so)和静态(.a)的程序那些猫腻.在这之前,我们需要了解一下源代码到可执行程序之间到底发生了什么神奇而美妙的事情. 在Linux操作系统中,普遍使用ELF格

LINUX系统中动态链接库的创建与使用

大家都知道,在WINDOWS系统中有很多的动态链接库(以.DLL为后缀的文件,DLL即Dynamic Link Library).这种动态链接库,和静态函数库不同,它里面的函数并不是执行程序本身的一部分,而是根据执行程序需要按需装入,同时其执行代码可在多个执行程序间共享,节省了空间,提高了效率,具备很高的灵活性,得到越来越多程序员和用户的青睐.那么,在LINUX系统中有无这样的函数库呢? 答案是肯定的,LINUX的动态链接库不仅有,而且为数不少.在/lib目录下,就有许多以.so作后缀的文件,这

Linux系统中的硬件问题如何排查?(3)

Linux系统中的硬件问题如何排查?(3) 2013-03-27 10:32 核子可乐译 51CTO.com 字号:T | T 在Linux系统中,对于硬件故障问题的排查可能是计算机管理领域最棘手的工作,即使是经验相当丰富的用户有时也会遇上自己搞不定的状况,本文分享一些实用的技巧与处理方法,希望有助于读者朋友理解.查明并最终搞定硬件难题. AD:2014WOT全球软件技术峰会北京站 课程视频发布 Dmesg命令 另外一些颇具价值的信息被保存在内核缓冲区日志当中,我们通常可以利用dmesg命令来调

在LINUX系统中安装KVM虚拟化

首先CPU要支持虚拟化(Intel是vmx,AMD是svm)[[email protected] ~]# egrep '(vmx|svm)' --color /proc/cpuinfo确保BIOS里开启VT,如果无法安装会有未开启虚似化的提示,去BISO里开启Intel(R) Virtualization Tech [Enabled] 安装虚拟化套件,由于安装包较多,应该先配置好YUM库,然后用YUM安装虚似化的四个组,完装完无法打开有可能是你少装包了,检查一下是不是有错字.[[email pr

Linux系统中“动态库”和“静态库”那点事儿【转】

转自:http://blog.chinaunix.net/uid-23069658-id-3142046.html 今天我们主要来说说Linux系统下基于动态库(.so)和静态(.a)的程序那些猫腻.在这之前,我们需要了解一下源代码到可执行程序之间到底发生了什么神奇而美妙的事情. 在Linux操作系统中,普遍使用ELF格式作为可执行程序或者程序生成过程中的中间格式.ELF(Executable and Linking Format,可执行连接格式)是UNIX系统实验室(USL)作为应用程序二进制