相关文章推荐
粗眉毛的牛排  ·  python 对数据分类并写入不同工作表 ...·  1 年前    · 
飘逸的海龟  ·  什么是受众标签筛选,如何做受众标签筛选_智能 ...·  2 年前    · 
逼格高的凉面  ·  html中pre和code标签 - 简书·  2 年前    · 
爱听歌的铁链  ·  Simple C# Http/TCP ...·  2 年前    · 
大鼻子的荒野  ·  glide - 简书·  2 年前    · 
Code  ›  ffmpeg中的时间戳与时间基开发者社区
时间戳 ffmpeg
https://cloud.tencent.com/developer/article/1608894
曾经爱过的小蝌蚪
1 年前
音视频_李超

ffmpeg中的时间戳与时间基

前往小程序,Get 更优 阅读体验!
立即前往
腾讯云
开发者社区
文档 建议反馈 控制台
首页
学习
活动
专区
工具
TVP
最新优惠活动
文章/答案/技术大牛
发布
首页
学习
活动
专区
工具
TVP 最新优惠活动
返回腾讯云官网
音视频_李超
首页
学习
活动
专区
工具
TVP 最新优惠活动
返回腾讯云官网
社区首页 > 专栏 > ffmpeg中的时间戳与时间基

ffmpeg中的时间戳与时间基

作者头像
音视频_李超
发布 于 2020-04-02 18:54:14
2.9K 0
发布 于 2020-04-02 18:54:14
举报
文章被收录于专栏: 音视频直播技术专家

前言

在开发多媒体播放器或直播系统时,音视频的同步是非常关键且复杂的点。要想把音视频同步搞明白,我们必须要了解一些基本的知识。只有了解了这些基本知识,才能为你打下理解音视频同步的基础。 本文将从下面几个主题介绍这些知识点:

  • I/B/P帧
  • PTS/DTS
  • 时间基
  • ffmpeg的内部时间基
  • 不同时间基的换算

I/B/P帧

对于 I帧,B帧,P帧,我想很多人对它们已经了解的很多了。

  • I帧是关键帧,它采用帧内压缩技术;
  • B帧是前后参考帧,它属由帧间压缩技术。也就是说在压缩成 B帧前,它会参考它前面的非压缩视频帧,和后面的非压缩的视频帧,记录下前后两帧都不存放的“残差值”,这样可以达到更好的压缩率;
  • P帧是向前参考帧,也就是它参考的是前一个关键帧的数据。P帧也属于帧间压缩技术,相对于 B帧来说,P帧的压缩率要比B帧低。

但在实时互动直播系统中,很少使用B帧。主要的原因是压缩和解码B帧时,由于要双向参考,所以它需要缓冲更多的数据,且使用的CPU也会更高。由于实时性的要求,所以一般不使用它。不过对于播放器来说,遇到带有B帧的H264数据是常有的事儿。

对于 H264 编码原理相关的知识请看我的免费视频课 《移动端音视频入门》

PTS/DTS

有了上面 I/B/P帧的概念,我们再来理解 PTS/DTS 就非常容易了。PTS(Presentation TimeStamp)是渲染用的时间戳,也就是说,我们的视频帧是按照 PTS 的时间戳来展示的。DTS(Decoding TimeStamp)解码时间戳,是用于视频解码的。

那为什么有了 PTS 还要有 DTS呢?这就与我们上面所讲的 I/B/P帧有关了。如果我们的视频中没有B帧,那显示的帧的顺序与存放的帧的顺序是一样的,此时PTS与DTS 的值就是一样的,也就没有存在两个时间戳的必要了。

但有了B帧之后,就不是这个样子了。我们举个简单的例子:

代码语言: javascript
复制
第一行,实际应展示的顺序:I    B    B    P
第二行,实际在存放的顺序:I    P    B    B
第三行,按实际顺序号展示:1    4    2    3
第四行,按实际顺序号展示:1    2    3    4

对于上面这个例子我们作下说明:

  1. 我们实际应该展示的帧的顺序是 I, B, B, P 帧解码后的视频帧。
  2. 但实际上,这些帧到达之后,在缓冲区里就按照第二行的样子存放的。为什么会这样呢?这是由于我上面所讲的,P帧参考的是 I帧,B帧是双向参考帧。也就是说,如果 I帧和P帧没有解码的话,B帧是无法进行解码的。基于此,为了解决这个问题就出现了 PTS和DTS两个时间戳。
  3. 第三行是视频帧真正的解码顺序,先解 I帧,然后是P帧,然后是第一个B帧,最后是第二个B帧。
  4. 最终的展示顺序是 I帧解码后的视频帧,第一个B帧解码后的视频帧,第二个B帧解码后的视频帧,最后是P帧解码后的视频帖。

时间基

有了时间戳之后,最终进行展示时还要需要将 PTS时间戳转成以秒为单位的时间。那这里需要向大家介绍一下 ffmpeg的时间基。

我们在执行 ffmpeg/ffplay命令时,可以通过控制台看到几个参数,分别是 tbr, tbn, tbc。这几个值是什么含义呢?其实就是不同的时间基。

  • tbr: 是我们通常所说的帧率。time base of rate
  • tbn: 视频流的时间基。 time base of stream
  • tbc: 视频解码的时间基。time base of codec

在ffmpeg中,不同的时间戳对应不同的时间基。对于视频的渲染我们使用的是视频流的时间基,也就是 tbn。那我们如何理解时间基呢? 其实非常简单,就是时间刻度。我们以帧率为例,如果每秒钟的帧率是 25帧,那么它的时间基(时间刻度)就是 1/25。也就是说每隔1/25 秒后,显示一帧。

所以如我们当前的时间是 100, 时间基是 1/25,那么转成秒的时间是多少呢? 100*(1/时间基),也就是100 * 1/25 = 4秒。是不是非常的简单?

ffmpeg内部时间基

除了我上面所讲的几个时间基之外,ffmpeg内部还有一个时间基。即我们通过所见到的 AV_TIME_BASE 。它在ffmpeg内部定义如下:

代码语言: javascript
复制
#define         AV_TIME_BASE   1000000

它还有一种分数所表式法:

代码语言: javascript
复制
#define         AV_TIME_BASE_Q   (AVRational){1, AV_TIME_BASE}

在 ffmpeg中进行换算,将不同时间基的值转成按秒为单位的值计算如下:

代码语言: javascript
复制
timestamp(秒) = pts * av_q2d(time_base)

这里引入了 av_q2d 这个函数,它的定义非常简单:

代码语言: javascript
复制
typedef struct AVRational{
int num; //numerator
int den; //denominator
} AVRational;
static inline double av_q2d(AVRational a){
* Convert rational to double.
 
推荐文章
粗眉毛的牛排  ·  python 对数据分类并写入不同工作表 - 赏尔 - 博客园
1 年前
飘逸的海龟  ·  什么是受众标签筛选,如何做受众标签筛选_智能用户增长-阿里云帮助中心
2 年前
逼格高的凉面  ·  html中pre和code标签 - 简书
2 年前
爱听歌的铁链  ·  Simple C# Http/TCP Server - Stack Overflow
2 年前
大鼻子的荒野  ·  glide - 简书
2 年前
今天看啥   ·   Py中国   ·   codingpro   ·   小百科   ·   link之家   ·   卧龙AI搜索
删除内容请联系邮箱 2879853325@qq.com
Code - 代码工具平台
© 2024 ~ 沪ICP备11025650号