IPB帧
编码 | 解释 |
I帧:帧内编码帧率(intra picture) | 关键帧,一个单独完整的视频画面 |
P帧:前向预测编码帧(predictive-frame) | 参考前一个I帧/P帧 解码的画面 |
B帧:双向预测内插 编码帧(bi-directionalinterpolated prediction frame) |
参考前一个I帧/P帧 以及后一个P帧 解码的画面 |
IDR帧(instantaneous decoding refresh picture) | H264的概念,类似I帧 |
DTS/PTS
解码类型 | |
DTS(Decoding Time Stamp) | 视频帧数据流何时解码, 主要用于视频的解码 |
PTS(Presentation Time Stamp) | 反映该帧何时显示,主要用于视频解码阶段进行视频的同步和输出 |
在没有B帧的情况下,DTS和PTS的输出顺序是一样的。因为B帧打乱了解码和显示的顺序,所以一旦存在B帧,PTS和DTS势必就会不同。
time_base
是时间的基准,比如{1,100}
,也就是将1s分成100份
,pts的值就是有多少份这样的time_base
,那么pts计算帧所在的时间:
timestamp(秒) = pts * av_q2d(time_base)
GOP:Group Of Picture
两个I帧之间形成一组图片,就是GOP,每一个GOP都是由关键帧开始的,关键帧是一幅完整的画面,GOP中间的帧都是不完整的,需要由关键帧、前面帧以及后面帧等一起运算得到
关键帧的间隔调节会影响GOP的长度,进而影响到读取GOP的速度。
api version
FFMpeg的API随着版本的更新,也发生了很多变化,有些API虽然在新版本中做了兼容仍旧可以使用,但是已经被标记为废弃。
旧API | 新API |
avcodec_decode_video2 | avcodec_send_packet avcodec_receive_frame |
在解码视频时,无论是新的API还是旧的API,当解析部分视频(视频第一帧不是I帧)时,会发生丢帧现象,也就是
实际解码得到的帧数 != FPS*Time