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#调用WinAPI及窗口过程

    C#调用WINAPI及Windows窗口消息的发与送 最近在做一个餐饮项目(C#Winform),其中有一块是做点菜宝接口的对接,点菜宝的厂商提供了一个WX.exe的驱动程序,这个驱动程序无直接打开, ...

  2. EL表达式获取Map和List中的值

    EL表达式获取Map和List中的值   EL表达式取Map中的值: 当Map中是String,String时 后台servlet中: Map<String, String> map1 = ...

  3. C++与Lua交互(四)

    引言 通过前几篇,我们已经对Lua的C API有了一定的了解,如lua_push*.lua_is*.lua_to*等等.用C++调用Lua数据时,我们主要运用lua_getglobal与lua_pus ...

  4. java学习笔记_GUI(1)

    import javax.swing.*; public class Gui { public static void main(String[] args) { JFrame frame = new ...

  5. L001-oldboy-mysql-dba-lesson01

          L001-oldboy-mysql-dba-lesson01 <sql应用重构>经典的书 ,思想,封顶境界! mysql下载页面: http://www.filewatcher ...

  6. RestFul && HATEOAS && Spring-Data-Rest介绍

    1.什么是RestFul 经常上网的同学会发现,现代软件的一个重要趋势就是互联网化,几乎没有一款软件是纯粹的单机版了.通常的情况下,软件管理着服务器的资源以及这些资源的状态变化,用户通过在浏览器输入h ...

  7. 非常出色的一款WinForm窗体重绘GUI类库源码

    基本控件的演示 ScrollBar滚动条 各种圆形进度条 ProgressBar进度条 Mdi演示,仿谷歌浏览器 多种皮肤可供选择 一套专业级别的GUI控件,目前包含了窗体.进度条.滚动条以及MDI多 ...

  8. 【原】web页面登陆验证

    using Itcast.Mall.Model; using System; using System.Collections.Generic; using System.Linq; using Sy ...

  9. C# CRC32

    using System;using System.Collections.Generic;using System.Linq;using System.Text;using System.Threa ...

  10. JavaScript 防止事件冒泡

    在我们书写一个弹窗的时候,我们往往需要点击弹窗的其他地方来隐藏弹窗. 通常我们会写成: $(document).bind('click',function(){ $('.pop-box').hide( ...