ffmpeg的timeBase的屬性解釋,用於計算每一幀的時間

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。

相關文章
相關標籤/搜索