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為單位。