参考:https://zhuanlan.zhihu.com/p/468346396 1、基本概念 ffmpeg中提及时间戳时,一定要明确它所对应的时基(time_base)。为精确描述该其数值,使用以下结构体来描述这一有理数概念。
typedef struct AVRational{
int num; ///< numerator
int den; ///< denominator
} AVRational;
在ffmpeg中,时间的单位是微妙,那么标准的时基为 (AVRational){1, 1000000},其中ffmpeg定义了两个宏
#define AV_TIME_BASE 1000000
#define AV_TIME_BASE_Q (AVRational){1, AV_TIME_BASE}
其中Q代表quotient,汉语为 “商”。
对于像H264视频的时基为(AVRational){1, 90000}。
2、同一时间戳在不同时基下的转换 例如, 在时基bq = {1,1000000}有时间戳 a1 = 48000,需要转换到时基 cq ={1,90000}下的时间戳a2,
计算过程应该为 a2 = 48000 *(1/1000000)/ (1/90000} = 4320,使用ffmpeg的对应接口计算函数为 a2 = av_rescale_q(a1, bq, cq); 。其中bq,cq为AVRational类型。
3、时长计算 时长=时间戳*时基 函数 av_q2d 用来 分数(结构体)转小数 如:计算视频时间(s)
int64_t current_time = pkt->pts*av_q2d(ic->streams[is->video_stream]->time_base);//结果为S,其中time_base为结构体(AVRational){1, 90000}
//Duration between 2 frames (us)
//int64_t frame_duration=(double)AV_TIME_BASE/av_q2d(ic->streams[is->video_stream]->r_frame_rate);//quotient to decimal
标签:ffmpeg,av,90000,AVRational,BASE,时间,TIME
From: https://blog.51cto.com/danielllf/8294944