FFmpeg 时间戳与时间基
什么是时间基?
FFmpeg中时间基是时间刻度,表示每个刻度有多少秒,能更精确的度量时间。在不同的封装格式下,时间基是不同的。
简单来说,比如一个时间刻度是0.0001秒,那么时间基就是1/10000。
时间基 = 时间刻度
在FFmpeg中表示时间基的的结构体是AVRational,其实就是一个分子分母组成的。
在FFmpeg中也有自己内部的时间基
/**
* Internal time base represented as integer
*/
#define AV_TIME_BASE 1000000
/**
* Internal time base represented as fractional value
*/
#define AV_TIME_BASE_Q (AVRational){1, AV_TIME_BASE}
什么是时间戳?
FFmpeg中的时间戳与我们平常所理解的时间戳有所区别,通常意义上的时间戳是指1970年到现在的秒数,而ffmpeg中的时间戳表示占多少个时间刻度,单位是时间刻度,而不是秒,这个理解非常重要,只有转成实际时间才有意义。
FFmpeg中有两个时间戳,PTS和DTS
PTS:显示时间戳,在什么时候开始显示这一帧数据。
DTS:解码时间戳,在什么时候开始解码这一帧数据。
实际时间(秒):时间戳 * 时间基,比如一帧数据的时间戳是1000,时间基是1/1000,那么这一帧数据在一秒的时候开始显示或者解码。
在使用ffprobe 命令是,我们经常看到这样一个输出
Stream #0:0(und): Video: h264 (High) (avc1 / 0x31637661), yuv420p, 640x368 [SAR 1:1 DAR 40:23], 380 kb/s, 25 fps, 25 tbr, 12800 tbn, 50 tbc (default)
标签:25,FFmpeg,base,时间,刻度,12800 From: https://www.cnblogs.com/wkzs/p/18115637tbr:time base of rate,表示帧率,比如上面,25 tbr 表示1/25秒,也就是一秒25张图片
tbn:time base of stream,表示视频流的时间基,12800 tbn,表示一个时间刻度就是1/12800,那么视频播放在1秒的时候,pts就是12800,两秒就是12800*2
tbc:time base of codec,表示视频解码的时间基。50 tbc,那么解码1秒的那一帧数据,DTS就是50