天天看點

談談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的了解。典型的細分思想。是不是非常簡單呢!!!