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# 远程回收IIS应用池

    利用下列代码可实现IIS应用池的远程回收 var serverManager = ServerManager.OpenRemote(ip); var appPools = serverManager. ...

  2. Android 源码编译及常见错误及解决方法

    最近要往arm开发板上移植android系统,大大小小的问题遇到了太多太多,都是泪啊.本人初接触嵌入式开发,对问题的根源不是太了解,不过好在每解决一个问题,便记录一下.话不多说,正式罗列问题: hos ...

  3. 同时存在两个或多个homestead 虚拟box

    开发中发现,不同版本的homestead 里面的环境各不相同,里面的node,npm等版本都不一致,如果需要添加 不同版本的homestead同时存在可以按照以下办法处理. tips: 提供可以离线下 ...

  4. mysql中使用update select

    UPDATE t_user INNER JOIN t_shake ON t_shake.user_id = t_user.user_id SET t_user.shake_total_num = t_ ...

  5. Android Activity 注意笔记

    图1:Activity生命周期的简化图,就像一个阶梯金字塔.这图像表明每个状态中是怎么样使用回调函数使得恢复状态回到顶端,或者降低状态到达底部.Activity可以从Paused状态和stopped状 ...

  6. 爬虫学习之基于Scrapy的爬虫自动登录

    ###概述 在前面两篇(爬虫学习之基于Scrapy的网络爬虫和爬虫学习之简单的网络爬虫)文章中我们通过两个实际的案例,采用不同的方式进行了内容提取.我们对网络爬虫有了一个比较初级的认识,只要发起请求获 ...

  7. sirius的python学习笔记(1)

    1.可以通过try...except语句来简单的判断字符串是否为整数值,如例程 x = raw_input('>') try: print int(x) except ValueError: r ...

  8. 开始学习python

    刚刚离开学校,到公司实习,发现所有的技术都是崭新的,所有的工具都是熟悉中带着陌生. 就像是孤身一人到了一个曾经只闻其名的偌大城市,看什么都觉得新鲜,做什么都心有畏惧.幸好 搞软件并没有那么多人情世故, ...

  9. C语言控制语句总结(if else for switch while break continue)

    一.if语句 1表达式 if(条件表达式) 语句 注: (1)条件表达式,一般为逻辑表达式或关系表达式,但也可以是任何数值类型,如整型.实型.字符型.指针型数据等. (2)语句,由于是C语言的语句,而 ...

  10. MS也遵守规范了

    CSS学的好不好,就看你对浏览器的兼容性处理的好不好. 拿opacity来说,本来写成opacity:0.3就完事了,但MS不来这套,它用filter,我们就不得不专门为它而 加上这么一大串(file ...