1. 程式人生 > >ffmpeg時間基種類及轉換

ffmpeg時間基種類及轉換

一、ffmpeg中時間基相關資料結構:

typedef struct AVRational{

int num; ///< numerator

int den; ///< denominator

} AVRational;

二、時間基有如下幾種:

1、InputStream: 時間基 1:1000000(單位:us)

2、AVStream:時間基 1:90000(單位:s)- 根據mpeg的協議,壓縮後或解壓前的資料,pts和dts是90kHz時鐘的取樣值

3、AVCodecContext:時間基 1:framerate (單位:s)

三、時間基的使用:

1、AVPacket:使用AVStream時間基

2、AVFrame:pts使用AVCodecContext時間基;pkt_pts、pkt_dts使用AVStream時間基

3、InputStream:使用InputStream時間基

四、時間基轉換函式

1、

int64_t av_rescale_q(int64_t a, AVRational bq, AVRational cq) av_const;

其中:a為待轉換時間;bq為待轉換時間依賴的時間基;cq為目標時間基。

上述公式等同於:

a * bq / cq

2、

void av_packet_rescale_ts(AVPacket *pkt, AVRational tb_src, AVRational tb_dst);

其中:pkt為編碼後資料包;src為原始時間基;dst為目標時間基

五、時間基擴充套件

AVFrame->pts和AVPacket->pts、AVPacket->dts的值,在解碼/編碼後,會經歷短暫的time_base不匹配的情況:

1、解碼後,decoded_frame->pts的值使用AVStream->time_base為單位,後在AVFilter裡面轉換成以AVCodecContext->time_base為單位。

2、編碼後,pkt.pts、pkt.dts使用AVCodecContext->time_base為單位,後通過呼叫"av_packet_rescale_ts"轉換為AVStream->time_base為單位。