视频基础知识(帧,时间基)
I/P/B帧
I帧:关键帧,采用的是帧内压缩技术
B帧:前后参考帧,它属于帧间压缩技术,在压缩成B帧前,它会参考它前面的非压缩视频帧,和后面的非压缩的视频帧,纪录下前后两帧都不存放的残差值,这样可以达到更好的压缩率。
P帧:向前参考帧,就是参考的是前一个关键帧的数据,P帧属于帧间压缩技术,相对于B帧,P帧的压缩率要比B帧低
IDR帧:(instantaneous decoding refresh picture)
因为H264采用了多帧预测,所以I帧之后的P帧有可能会参考I帧之前的帧,这就使得随机访问的时候不能找到I帧作为参考条件,因为找到I帧,I帧之后的帧还是有可能解析不出来。而IDR帧就是一种特殊的I帧,即这一帧之后的所有参考帧只会参考到这个IDR帧,而不会参考前面的帧。在解码器中,一旦收到IDR帧,就会立即清理参考帧缓冲区,并将IDR帧作为被参考的帧。
PTS/DTS
PTS:(Presentation TimeStamp)是渲染用的时间戳,也就是说,我们的视频帧按照PTS的时间戳来展示的
DTS:(Decoding TimeStamp)解码时间戳,是用于视频解码的
存在即合理,存在的原因:
第一行,实际应展示的顺序:I B B P
第二行,实际在存放的顺序:I P B B
第三行,按实际顺序号展示:1 4 2 3
第四行,按实际顺序号展示:1 2 3 4
解释:实际展示的帧顺序是I,B,P,P,解码后的视频帧,但实际上这些帧到达之后,P帧参考的是I帧,B帧是双向参考帧,如果I帧和P帧没有解码的话,B帧是无法进行解码的,基于这个问题就出现了PTS和DTS两个时间戳。
时间基
有了时间戳之后,最终进行展示时还需要将PTS时间戳转成以秒为单位的时间
通常在ffmpeg/ffplay命令时,分别是tbr,tbn,tbc
tbr:是我们通常说的帧率。 time base of rate
tbn:视频流的时间基。time base of stream
tbc:视频解码的时间基。time base of codec
在ffmpeg中,不同的时间戳对应不同的时间基。对于视频的渲染我们使用的是视频流的时间基,也就是tbn
时间基即时间刻度,我们以帧率为例,每秒钟的帧率是25帧,那么他的时间基就是1/25,也就是每隔1/25秒后,显示一帧,假设我们当前时间为100,时间基是1/25,转成秒就是 100 * 1/25 = 4