fmpeg中的時間單位
AV_TIME_BASE
ffmpeg中的內(nèi)部計時單位(時間基)舞蔽,ffmepg中的所有時間都是于它為一個單位屎蜓,比如AVStream中的duration即以為著這個流的長度為duration個AV_TIME_BASE贴汪。AV_TIME_BASE定義為:
define AV_TIME_BASE 1000000
AV_TIME_BASE_Q
ffmpeg內(nèi)部時間基的分數(shù)表示晤锥,實際上它是AV_TIME_BASE的倒數(shù)除呵。從它的定義能很清楚的看到這點:
define AV_TIME_BASE_Q (AVRational){1, AV_TIME_BASE}
AVRatioal的定義如下:
typedef struct AVRational{int num; //numeratorint den; //denominator} AVRational;
ffmpeg提供了一個把AVRatioal結(jié)構(gòu)轉(zhuǎn)換成double的函數(shù):
static inline double av_q2d(AVRational a){
/**
- Convert rational to double.
- @param a rational to convert
**/
return a.num / (double) a.den;
}
現(xiàn)在可以根據(jù)pts來計算一楨在整個視頻中的時間位置:
timestamp(秒) = pts * av_q2d(st->time_base)
計算視頻長度的方法:
time(秒) = st->duration * av_q2d(st->time_base)
這里的st是一個AVStream對象指針燎窘。
時間基轉(zhuǎn)換公式
timestamp(ffmpeg內(nèi)部時間戳) = AV_TIME_BASE * time(秒)
time(秒) = AV_TIME_BASE_Q * timestamp(ffmpeg內(nèi)部時間戳)
所以當需要把視頻跳轉(zhuǎn)到N秒的時候可以使用下面的方法:
int64_t timestamp = N * AV_TIME_BASE; 2av_seek_frame(fmtctx, index_of_video, timestamp, AVSEEK_FLAG_BACKWARD);
ffmpeg同樣為我們提供了不同時間基之間的轉(zhuǎn)換函數(shù):
int64_t av_rescale_q(int64_t a, AVRational bq, AVRational cq)
這個函數(shù)的作用是計算a * bq / cq,來把時間戳從一個時基調(diào)整到另外一個時基股耽。在進行時基轉(zhuǎn)換的時候椿肩,我們應(yīng)該首選這個函數(shù),因為它可以避免溢出的情況發(fā)生豺谈。