视频

视频的播放过程可以简单理解为一帧一帧的画面按照时间顺序呈现出来的过程,就像在一个本子的每一页画上画,然后快速翻动的感觉。

但是在实际应用中,并不是每一帧都是完整的画面,因为如果每一帧画面都是完整的图片,那么一个视频的体积就会很大,这样对于网络传输或者视频数据存储来说成本太高,所以通常会对视频流中的一部分画面进行压缩(编码)处理。由于压缩处理的方式不同,视频中的画面帧就分为了不同的类别,其中包括:I 帧、P 帧、B 帧。

I、P、B 帧

I 帧、P 帧、B 帧的区别在于:

  • I 帧(Intra coded frames):I 帧图像采用帧内编码方式,即只利用了单帧图像内的空间相关性,而没有利用时间相关性。I 帧使用帧内压缩,不使用运动补偿,由于 I 帧不依赖其它帧,所以是随机存取的入点,同时是解码的基准帧。I 帧主要用于接收机的初始化和信道的获取,以及节目的切换和插入,I 帧图像的压缩倍数相对较低。I 帧图像是周期性出现在图像序列中的,出现频率可由编码器选择。
  • P 帧(Predicted frames):P 帧和 B 帧图像采用帧间编码方式,即同时利用了空间和时间上的相关性。P 帧图像只采用前向时间预测,可以提高压缩效率和图像质量。P 帧图像中可以包含帧内编码的部分,即 P 帧中的每一个宏块可以是前向预测,也可以是帧内编码。
  • B 帧(Bi-directional predicted frames):B 帧图像采用双向时间预测,可以大大提高压缩倍数。值得注意的是,由于 B 帧图像采用了未来帧作为参考,因此 MPEG-2 编码码流中图像帧的传输顺序和显示顺序是不同的。

也就是说,一个 I 帧可以不依赖其他帧就解码出一幅完整的图像,而 P 帧、B 帧不行。P 帧需要依赖视频流中排在它前面的帧才能解码出图像。B 帧则需要依赖视频流中排在它前面或后面的帧才能解码出图像。

这就带来一个问题:在视频流中,先到来的 B 帧无法立即解码,需要等待它依赖的后面的 I、P 帧先解码完成,这样一来播放时间与解码时间不一致了,顺序打乱了,那这些帧该如何播放呢?这时就需要我们来了解另外两个概念:DTS 和 PTS。

DTS、PTS 的概念

DTS、PTS 的概念如下所述:

  • DTS(Decoding Time Stamp):即解码时间戳,这个时间戳的意义在于告诉播放器该在什么时候解码这一帧的数据。
  • PTS(Presentation Time Stamp):即显示时间戳,这个时间戳用来告诉播放器该在什么时候显示这一帧的数据。

需要注意的是:虽然 DTS、PTS 是用于指导播放端的行为,但它们是在编码的时候由编码器生成的。

当视频流中没有 B 帧时,通常 DTS 和 PTS 的顺序是一致的。但如果有 B 帧时,就回到了我们前面说的问题:解码顺序和播放顺序不一致了。

比如一个视频中,帧的显示顺序是:I B B P,现在我们需要在解码 B 帧时知道 P 帧中信息,因此这几帧在视频流中的顺序可能是:I P B B,这时候就体现出每帧都有 DTS 和 PTS 的作用了。DTS 告诉我们该按什么顺序解码这几帧图像,PTS 告诉我们该按什么顺序显示这几帧图像。顺序大概如下:

  1. PTS: 1 4 2 3
  2. DTS: 1 2 3 4
  3. Stream: I P B B

音视频的同步

上面说了视频帧、DTS、PTS 相关的概念。我们都知道在一个媒体流中,除了视频以外,通常还包括音频。音频的播放,也有 DTS、PTS 的概念,但是音频没有类似视频中 B 帧,不需要双向预测,所以音频帧的 DTS、PTS 顺序是一致的。

音频视频混合在一起播放,就呈现了我们常常看到的广义的视频。在音视频一起播放的时候,我们通常需要面临一个问题:怎么去同步它们,以免出现画不对声的情况。

要实现音视频同步,通常需要选择一个参考时钟,参考时钟上的时间是线性递增的,编码音视频流时依据参考时钟上的时间给每帧数据打上时间戳。在播放时,读取数据帧上的时间戳,同时参考当前参考时钟上的时间来安排播放。这里的说的时间戳就是我们前面说的 PTS。实践中,我们可以选择:同步视频到音频、同步音频到视频、同步音频和视频到外部时钟。

参考

  • MPEG-2 Wiki
  • MPEG-2 的同步及时间恢复
  • Synching Video

理解音视频 PTS 和 DTS相关推荐

  1. 音视频中的DTS、PTS

    写这个还是为了给自己保存啊   勿怪啊 内容肯定都是老的 只给粉丝看了  琢磨存取证视频时和这个题目关联 欢迎讨论 whaosoft aiot http://143ai.com I.P.B 帧 I 帧 ...

  2. 音视频中的PTS和DTS及同步

    相关索引:https://blog.csdn.net/knowledgebao/article/details/84776869 视频的播放过程可以简单理解为一帧一帧的画面按照时间顺序呈现出来的过程, ...

  3. Android 深入系统完全讲解(二)音视频理解攻略 PDF

    原创PDF |<Android 深入系统完全讲解>,可能价值百万! 最近因为训练营里面,想学习音视频的比较多,当然也有一部分因素是我在给大家讲市场时候,说了,算法和界面,其实是市场的一个底 ...

  4. 录像音视频同步原理分析及PTS计算公式

    图解分析 音视频同步要分别保证开始的PTS一样,PTS是控制帧的显示时间的,所以要实现音视频同步必须分别设置音视频的PTS. 注:音.视频最后一帧的PTS时刻不一定相同. 1. 视频时间戳计算 pts ...

  5. 音视频解封装:MP4核心Box详解及H264AAC打包方案

    ​问题背景: 上一篇文章<音视频封装:MP4结构概述和分析工具>让大家看了下MP4的主要结构和推荐了一些分析工具,如果你对MP4没有任何了解,还是先看上文,了解MP4的基本结构,其中还有许 ...

  6. 通俗的解释下音视频同步里pcr作用

    PCR同步在非硬件精确时钟源的情况还是谨慎使用,gstreamer里面采用PCR同步,但是发现好多ffmpeg转的片儿,或者是CP方的片源,pcr打得很粗糙的,老是有跳帧等现象. 音视频同步,有三种方 ...

  7. 音视频开发二:音视频知识总结

    文章目录 简介 简单理解,音视频原理 音视频理论基础 音频 声音介绍 **为什么要存在数字音频 ?** **什么是数字音频?** 从"模拟信号"到"数字化"的过 ...

  8. 音视频同步原理及实现

    本文主要描述音视频同步原理,及常见的音视频同步方案,并以代码示例,展示如何以音频的播放时长为基准,将视频同步到音频上以实现视音频的同步播放.内容如下: 1.音视频同步简单介绍 2.DTS和PTS简介 ...

  9. ffmpeg入门小结(二)——音视频同步

    1.H264格式简介(视频解码同步相关) ---------------------- 前言 ----------------------- H264是新一代的编码标准,以高压缩高质量和支持多种网络的 ...

最新文章

  1. 心血来潮学python
  2. oracle学习-存储过程返回一个值,和返回一个结果集
  3. linux内核如何安装vim,如何在Linux 中安装和使用 PacVim?
  4. Android中的windowSoftInputMode属性详解
  5. PHP正则表达式大全
  6. 用bde连接 连接sql server2005
  7. 关于DubboMain启动的真相
  8. 如何使用 一行代码 搞定一组数据的(极值、平均值、中位数、四分位数、数量统计和标准差)
  9. 大话数据结构 :排序
  10. SAP Data Intelligence API执行出错的排错之道
  11. 制作Oracle dockerfile镜像
  12. SpringMVC 统一异常处理
  13. XP系统装python
  14. python 有道翻译,python 实现有道翻译功能
  15. cls love even fib!(打表,找规律)
  16. 报错ValueError: check_hostname requires server_hostnam ImportError: cannot import name ‘imread’ from
  17. vagrant下载速度慢的解决方法
  18. 计算机英语趣味知识,看段子,学英语,懂点计算机知识才能看懂哦!
  19. C primer plus(第六版)第五章源代码
  20. 数据库如何转身云原生数据库

热门文章

  1. 永乐XIANDAI 08
  2. IOS Unit test
  3. pku 2635 The Embarrassed Cryptographer 数论——素数筛选法+模拟大数除法
  4. [C#]我自己写的一个对字节中每位进行修改值的函数
  5. SQL Server 2008使用LINQ进行数据访问(转载自IT168 [ http://www.it168.com/ ])
  6. 会计的思考(3):通过公司例会制度加强财务管理职能
  7. CodeForces - 1301D Time to Run(构造+模拟)
  8. POJ - 3254 Corn Fields(状压dp)
  9. js检测鼠标是否在操作_原生JS趣味demo:炫酷头像鼠标追随效果的实现
  10. 【项目源码分享】基于C++实现的网店购物管理系统(VS2019控制台)