[✔️]FFMpeg与视频的基础知识

286 阅读2分钟

开启掘金成长之旅!这是我参与「掘金日新计划 · 2 月更文挑战」的第 14 天,点击查看活动详情

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_video2avcodec_send_packet
avcodec_receive_frame

在解码视频时,无论是新的API还是旧的API,当解析部分视频(视频第一帧不是I帧)时,会发生丢帧现象,也就是

实际解码得到的帧数 != FPS*Time