视频 TS 内容详细讲解
题记:时间戳将每一秒分成90000份,即将每一毫秒分成90份
MPEG2系统用于视音频同步以及系统时钟恢复的时间标签分别在ES,PES和TS这3个层次中。
在TS 层, TS头信息包含了节目时钟参考PCR(Program Clock Reference),
用于恢复出与编码端一致的系统时序时钟STC(System Time Clock)。
在PES层, 在PES头信息里包含有表示时间戳PTS(Presentation Time Stamp)和
解码时间戳DTS(Decoding Time Stamp);
在ES 层, 与同步有关的主要是视频缓冲验证VBV(Video Buffer Verifier),
用以防止解码器的缓冲器出现上溢或者下溢;

同步机制
编码器
系统时钟STC:
编码器中有一个系统时钟(其频率是27MHz),
此时钟用来产生指示音视频的正确显示和解码的时间戳,
同时可用来指示在采样过程中系统时钟本身的瞬时值

PCR(Program Clock Reference):
指示系统时钟本身的瞬时值的时间标签称为节目参考时钟标签(PCR)。

PCR的插入必须在PCR字段的最后离开复用器的那一时刻,
同时把27MHz系统时钟的采样瞬时值作为PCR字段插入到相应的PCR域。
它是放在TS包头的自适应区中传送.

27MHz的系统时钟STC经波形整理后分成两路:
PCR_ext (9bits ), 由27MHz脉冲直接触发计数器生成扩展域.
PCR_base(33bits), 经300分频器分频成90kHz脉冲送入一个33位计数器生成90kHz基值,
用于和PTS/DTS比较,产生解码和显示所需要的同步信号.
这两部分被置入PCR域,共同组成42位的PCR.

输入到T-STD解码器的第i个字节的PCR值:
PCR(i) = PCR_base(i)*300 + PCR_ext(i)
i: 包含program_clock_reference_base域的最后一个比特的字节号.

PCR_base(i) = ((system_clock_frequency * t(i)) / 300) % 2^33
PCR_ext(i) = ((system_clock_frequency * t(i)) / 1 ) % 300
t(i): 字节i的编码时间.

例如:
时间"03:02:29.012"的PCR计算如下:
03:02:29.012 = ((3 * 60) + 2) * 60 + 29.012 = 10949.012s

PCR_base = ((27 000 000 * 10949.012) / 300) % 2^33 = 98 541 080
PCR_ext = ((27 000 000 * 10949.012) / 1 ) % 300 = 0
PCR = 98 541 080 * 300 + 0 = 295 623 324 000

逆推一个:
假设PCR= 1209740011800
PCRbase = 1209740011800/300 = 4032466706
PCR-ext = 1209740011800%300 = 0
t =PCRbase*300/27000000 = 44805.185622222222222222222222222
time: t/3600: ( t-(t/3600))/60: t-( t-(t/3600))/60 = 12:26:45.185622222222222222222222222
PCR-base的作用:
a. 与PTS和DTS作比较, 当二者相同时, 相应的单元被显示或者解码.
b. 在解码器切换节目时,提供对解码器PCR计数器的初始值,
以让该PCR值与PTS、DTS最大可能地达到相同的时间起点.
PCR-ext的作用:
通过解码器端的锁相环路修正解码器的系统时钟, 使其达到和编码器一致的27MHz.

PTS(Presentation Time Stamp):
指示音视频显示时间的时间戳称为显示时间戳(PTS);

PTS域为33bits, 是对系统时钟的300分频的时钟的计数值.
它被编码成为3个独立的字段:
PTS[32…30][29…15][14…0]
表示此分组中第一个访问单元在系统目标解码器中的预定显示时间.

PTS值为:
PTS(k) = ((system_clock_frequency * TPn(k)) / 300) % 2^33
TPn(k): 表示单元Pn(k)的表示时间.

以上一个PCR:12:26:45.185622222222222222222222222为基准
当前IDR帧(poc=0)的PTS为:4032475706
time = PTS300/27000000 = 44805.285622222222222222222222222 = 12:26:45.285622222222222222222222222
当期poc=1 的PTS为:4032479306
time1 = PTS
300/27000000 =44805.365622222222222222222222222 = 12:26:45.325622222222222222222222222222
time1-time2 = 0.04
即0.04s 播放一帧 一秒播放 25帧
我们可以看到两个PTS之间相差3600 40ms播放一帧 则 3600 = 40*90(90hz) = 3600
DTS(Decoding Time Stamp):
指示音视频的解码时间戳称为解码时间戳(DTS),

DTS域为33bits,编码成为3个独立的字段:
DTS[32…30][29…15][14…0]
表示此分组中第一个访问单元在系统目标解码器中的预定解码时间.

DTS值为:
DTS(j) = ((system_clock_frequency * TDn(j)) / 300) % 2^33
TDn(j): 第n个ES流的第j个存取单元An(j)的解码时间.

DTS就视频来说,因为视频编码的时候用到了双向预测,
一个图像单元被解出,并非马上就被显示,可能在存储器中留一段时间,作为其余图像单元的解码参考,
在被参考完毕后,才被显示.

音频PTS:
针对音频和视频的同步显示,MPEG提出了一个音频PTS.
由于声音没有用到双向预测,它的解码次序就是它的显示次序,故它只有PTS.

VBV_delay:
视频流延时值,
在解码时利用视频流缓冲区把视频流缓存到相应的vbv_delay时间后,
再启动解码器解码、显示、实现音视频的同步.
VBV_delay存在于视频ES的头部,长度为16bit.

解码器
首先, 解析PCR, 重建和编码器同步的27MHz系统时钟, 恢复27MHz系统时钟后;
再, 通过VBV_delay(视频流延时值)的数值来确定解码的开始;
之后, 利用PES流中解码时间戳(DTS)和显示时间戳(PTS)来确定解码和显示的次序.
用PCR来对系统时钟进行修正.

解码器同步算法总结如下:
(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相等时,就可显示/解码。

视频 TS 内容详细讲解相关推荐

  1. sublime搭建C/C++编译环境(超完美的配置并配上内容详细讲解!!)

    简述 有两台电脑,之前的电脑上就有之前好基友分享的cpp配置. 但是另外一台电脑上,一开始就没有配置这个. 然后,在网上搜,发现搜到的那些配置.抱歉,我的意思是,在坐的各位都是垃圾 我的C/C++的配 ...

  2. JVM核心内容详细讲解

    JVM 1.引言 1.1 什么是JVM 定义: Java Virtual Machine - java 程序的运行环境(java 二进制字节码的运行环境) 好处: 一次编写,到处运行 自动内存管理,垃 ...

  3. vue-trtc多人视频开发(从零开始)-有手就行篇-最详细讲解

    大家花个几分钟把帖子详细看完  新手也能做直播集成开发!一步到位  相信小编 最效率最省力最通透的文档! 甚至直接可以copy使用的哦!!但是记得给小编一个赞吧 孩子天天熬夜加班 还写博客确实不容易 ...

  4. 蓝牙聊天App设计3:Android Studio制作蓝牙聊天通讯软件(完结,蓝牙连接聊天,结合生活情景进行蓝牙通信的通俗讲解,以及代码功能实现,内容详细,讲解通俗易懂)

    前言:蓝牙聊天App设计全部有三篇文章(一.UI界面设计,二.蓝牙搜索配对连接实现,三.蓝牙连接聊天),这篇文章是:三.蓝牙连接聊天. 课程1:Android Studio小白安装教程,以及第一个An ...

  5. java循环输入_【图文+视频新手也友好】Java一维数组详细讲解(内含练习题答案+详解彩蛋喔~)...

    [新手友好型视频+图文] 全面讲解Java一维数组(内含带答案和讲解的练习题彩蛋喔) 看完即上手!更有详解版练习题来帮你加深印象~~ 一.视频讲解 一维数组详解https://www.zhihu.co ...

  6. 服务器阵列卡安装win7系统,乐扩阵列卡IO-PCE9230-4IR组阵列方法和windows7系统安装到阵列组详细讲解(附视频) - 常见问题 - 技术支持 - 乐扩...

    以[乐扩IO-PCE9230-4IR阵列卡]为例,详细讲解组阵列方法,安装Win7 操作系统安装到阵列组的方法: 一.组阵列:[观看视频] 先组阵列: 1.在关机状态下,把阵列卡插到主板的PCI-E插 ...

  7. 如何在地图上采集数据呢?视频详细讲解全过程!

    如何在地图上采集数据呢?视频详细讲解全过程! 详细讲解采集地图上的数据全过程!

  8. 2022年华数杯C题插层熔喷完整解题思路(附代码+详细讲解视频)

    1.题目背景 C 题 插层熔喷非织造材料的性能控制研究 熔喷非织造材料是口罩生产的重要原材料,具有很好的过滤性能,其生产工艺简单.成本低.质量轻等特点,受到国内外企业的广泛关注. 熔喷非织造材料是口罩 ...

  9. Redis最详细讲解

    Redis最详细讲解 原文地址 本文脑图 redis基本数据结构 本文脑图 前言 Redis核心对象 String类型 int SDS SDS与c语言字符串对比 String类型应用 Hash类型 字 ...

最新文章

  1. c语言课程设计贴吧,【图片】发几个C语言课程设计源代码(恭喜自己当上技术小吧主)【东华理工大学吧】_百度贴吧...
  2. 网络协议命令行处理c语言程序解析,网络协议工程SPIN实验报告剖析.doc
  3. Thymeleaf文档
  4. python虚拟环境 virtualenv工具
  5. Android 起调手机QQ,联系客服
  6. 手把手教你VMware 安装 CentOS
  7. 腾讯加持,雷军力荐,这款游戏手机要火?
  8. 山石防火墙CLI创建VLAN
  9. 万能数据库查询分析器 5.05发布,本人为之撰写的相关技术文章达65篇
  10. PHP一维数组转二维数组正则表达式
  11. 码率自适应算法深入浅出
  12. 用这几种方式清理Mac缓存,你的Mac就不会卡了
  13. 张亚勤、刘慈欣、周鸿祎、王飞跃新书推荐,《崛起的超级智能:互联网大脑如何影响科技未来》...
  14. WINVNC源码分析(三)rdr
  15. NLP学习笔记 01 分词、词性标注和关键词提取
  16. ChatGPT/大模型+零代码,给中小企业带来哪些机会?
  17. SQLZOOL练习题答案和解析 第1关 SELECT name
  18. 一、Linux 教程-基础
  19. 2022-2028全球CAE工程服务行业调研及趋势分析报告
  20. juju based openstack upgrade (by quqi99)

热门文章

  1. 数据安全--12--隐私保护浅析
  2. C语言中%*s,%*c (还有%*.*s)
  3. mysql查询日期_mysql 查询当前日期
  4. 手把手教你搭建LAMP环境,运行第一个属于你的个人网站
  5. 风水轮流转!身价594亿美元,超马化腾成中国互联网首富
  6. Memcached Redis构建缓存服务器
  7. 如何让导航条高亮显示
  8. 【算法】求解最大连续子序列和的问题
  9. html后台登录界面网页设计界面
  10. 天干地支(python)