FFMPEG的不少結構中有AVRational time_base;這樣的一個成員,它是AVRational結構的編碼
typedef struct AVRational{
int num; ///< numerator
int den; ///< denominator
} AVRational;io
AVRational這個結構標識一個分數,num爲分數,den爲分母。容器
實際上time_base的意思就是時間的刻度:ffmpeg
如(1,25),那麼時間刻度就是1/25im
(1,9000),那麼時間刻度就是1/90000數據
那麼,在刻度爲1/25的體系下的time=5,轉換成在刻度爲1/90000體系下的時間time爲(5*1/25)/(1/90000) = 3600*5=18000文件
ffmpeg中作pts計算時,存在大量這種轉換時間
在如下結構中都有co
AVCodecContext:編解碼上下文。360
AVStream:文件或其它容器中的某一個track。
若是由某個解碼器產生固定幀率的碼流
AVCodecContext中的AVRational根據幀率來設定,如25幀,那麼num = 1,den=25
AVStream中的time_base通常根據其採樣頻率設定,如(1,90000)
在某些場景下涉及到PTS的計算時,就涉及到兩個Time的轉換,以及到底取哪裏的time_base進行轉換:
場景1:編碼器產生的幀,直接存入某個容器的AVStream中,那麼此時packet的Time要從AVCodecContext的time轉換成目標AVStream的time
場景2:從一種容器中demux出來的源AVStream的frame,存入另外一個容器中某個目的AVStream。
此時的時間刻度應該從源AVStream的time,轉換成目的AVStream timebase下的時間。
其實,問題的關鍵仍是要理解,不一樣的場景下取到的數據幀的time是相對哪一個時間體系的。
demux出來的幀的time:是相對於源AVStream的timebase
編碼器出來的幀的time:是相對於源AVCodecContext的timebase
mux存入文件等容器的time:是相對於目的AVStream的timebase
這裏的time指pts。