ffmpeg 的時間
名詞解釋
PTS:播放時間戳DTS:解碼時間戳
注意:如果沒有 B 幀,那麼 PTS 和 PTS 是一樣的
音視頻流中有一些信息表明了,音視頻以多快的速度播放,音頻是採樣率,視頻則是幀率
ffmpeg 中的時間單位
AV_TIME_BASE:ffmpeg 的時間單位,也叫做時間基。ffmpeg 中的時間單位不是秒,而是AV_TIME_BASE,所有的時間都是以他爲單位的。定義如下:
#define AV_TIME_BASE 1000000
AV_TIME_BASE_Q:時間基的倒數,實際是 (AVRational){1, AV_TIME_BASE},也就是 1/AV_TIME_BASE。
AVRational 表示分數,定義如下:
typedef struct AVRational{
int num; //分子
int den; //分母
} AVRational;
另外,可以用 av_q2d 函數 把 AVRational 轉換成浮點數
ffmpeg 的時間計算
4.1、根據 pts 計算真實的時間(秒):
timestamp = pts * av_q2d(st→time_base)
4.2、根據 duration 計算視頻的長度:
time = st->duration * av_q2d(st->time_base)
4.3、時間轉換公式:
ffmpeg 內部時間:timestamp(ffmpeg 內部時間戳) = AV_TIME_BASE * time(秒)
常規時間:time(秒) = AV_TIME_BASE_Q * timestamp(ffmpeg 內部時間戳)
4.4、視頻跳轉的方法:
int64_t timestamp = N * AV_TIME_BASE;
av_seek_frame(fmtctx, index_of_video, timestamp,AVSEEK_FLAG_BACKWARD);
4.5、不同的時間基之間的轉換:
int64_t av_rescale_q(int64_t a, AVRational bq, AVRational cq)