天天看点

谈谈time_scale和time_base的理解

在音视频领域,常常会看到time_scale和time_base这样的概念。由于这是非常基础的概念,在许多书本、工程代码中并没有解释这两个概念的实际含义。正是从这个角度出发,我将谈一谈对这两个概念的理解,故形成此文。

首先,从常识角度来看

我们现行的时间单位有:小时(h),分钟(min),秒(s),毫秒(ms),微妙(us)等。

对于小时,我们知道1(h)=60(min)。也就是将1小时细分为60个刻度,每个刻度就是1分钟。一小时的 时间刻度(time_scale) 有60个,每一个刻度的时间由 时间基(time_base) 表示,一个时间基就代表1/60个小时,也就是1分钟。因此,time_scale=60,time_base = 1/60 (h) = 1 (min)。

对于分钟,时间刻度(time_scale)也是60个,但每一个刻度,也就是时间基(time_base)代表1/60个分钟,即1秒。time_scale=60,time_base = 1/60 (min) = 1(s)。

对于秒,时间刻度(time_scale)是1000个,每一个刻度,也就是时间基(time_base)代表1/1000个秒,即1毫秒。time_scale=1000,time_base = 1/1000 (s) = 1(ms)。

相信看到这里,可以发现,本质上就是不同精度的时间度量单位的表示,这些约定俗成的转换规则就是所谓的时间转换标准。

在音视频领域,我们常看到,

time_scale = 1000,time_base = 1/1000

time_scale = 30000,time_base = 1/30000

time_scale = 90000, time_base = 1/90000

什么意思呢?

通常我们观看的电视节目、视频等,都包含有视频流、音频流、字幕流;3种流要保持同步(通俗的讲就是嘴型、声音、字幕都对的上),就需要基于时间戳的同步机制(同步机制的原理本文不展开)。而这个时间戳就是所谓的PTS(显示时间戳)。以视频为例,假设视频的帧率为25fps,就是一秒钟要显示25帧图像,那么每帧图像的显示时长为40(ms)。如果采用time_scale = 90000, time_base = 1/90000(s)来度量PTS,意思是将1秒划分为90000个刻度,每一个刻度表示1/90000秒;那么要将25帧图像以time_sclae=90000在1秒内均分,每帧图像的显示时长的起始时刻就用pts表示,

第1帧pts=0,

第2帧pts=3600,转换为时间就是 3600*time_base=0.04(s)=40(ms),即第2帧图像的显示的起始时刻为40ms

第3帧pts=7200,转换为时间就是 7200*time_base=0.08(s)=80(ms),即第2帧图像的显示的起始时刻为80ms

依此类推。

不同精度的时间度量,在表现形式上不同,但时间度量上是一样。

  1. 25fps,1秒的时间刻度time_scale = 1000, time_base = 1/1000,那么每帧图像占40个time_base = 40(ms)—基于常识时间度量单位
  2. 1秒的时间刻度,将精度提高为time_scale = 90000,time_base=1/90000(s),那么每帧图像占3600个time_base 也是 40(ms)

问题又来了,为什么要使用不同精度的time_scale呢?简单来说,因为视频流、音频流、字幕流的采样精度不同,为了使不同流同步,需要足够精度time_scale来表示pts,使视频同步。

好了,以上内容表示time_scale和time_base的理解。典型的细分思想。是不是非常简单呢!!!