开启掘金成长之旅!这是我参与「掘金日新计划 · 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_video2 | avcodec_send_packet avcodec_receive_frame |
在解码视频时,无论是新的API还是旧的API,当解析部分视频(视频第一帧不是I帧)时,会发生丢帧现象,也就是
实际解码得到的帧数 != FPS*Time