视频编解码之GOP

前言

在MPEG视频编码标准中,图像集合(Group of pictures,GOP,也翻译成图像群组)是一组以MPEG编码的视频内部的连续图像,每一个以MPEG标准编码的视频都由连续的若干个图像集合组成。图像集合的长度即一个I帧和下一个I帧之间的帧数。
在这里插入图片描述

H.264与I/P/B帧

H.264是目前使用最为广泛的视频压缩标准之一,随着x264/openh264和ffmpeg等开源库的推出,这一标准被越来越广泛的采用。而GOP概念作为H.264标准中的一员,需要结合更细的I/P/B帧概念分析。

I/P/B帧是H.264编码中至关重要的一组概念,表示的是视频中帧的类型。

  • I帧也被称为关键帧(Key-frame),它是完整编码帧,无需参考其他帧数据就能解码。
  • P帧被称为前向预测编码帧,其需要参考它之前的I帧和P帧进行解码,P帧数据只对与前I/P帧数据之间的差进行编码,因此能降低编码后的数据量。
  • B帧被称为双向预测编码帧,由前面的I/P帧和后面的P帧来进行预测。能极大降低编码后的数据量。

在这里插入图片描述

更多I/P/B帧的特点可以查阅参考资料[5]

I 帧特点:

它是一个全帧压缩编码帧。它将全帧图像信息进行JPEG压缩编码及传输; 
解码时仅用I帧的数据就可重构完整图像; 
I帧描述了图像背景和运动主体的详情; 
I帧不需要参考其他画面而生成; 
I帧是P帧和B帧的参考帧(其质量直接影响到同组中以后各帧的质量); 
I帧是帧组GOP的基础帧(第一帧),在一组中只有一个I帧; 
I帧不需要考虑运动矢量; 
I帧所占数据的信息量比较大。 

P帧特点:

P帧是I帧后面相隔1~2帧的编码帧; 
P帧采用运动补偿的方法传送它与前面的I或P帧的差值及运动矢量(预测误差); 
解码时必须将I帧中的预测值与预测误差求和后才能重构完整的P帧图像; 
P帧属于前向预测的帧间编码。它只参考前面最靠近它的I帧或P帧; 
P帧可以是其后面P帧的参考帧,也可以是其前后的B帧的参考帧; 
由于P帧是参考帧,它可能造成解码错误的扩散; 
由于是差值传送,P帧的压缩比较高。 

B帧特点

B帧是由前面的I或P帧和后面的P帧来进行预测的; 
B帧传送的是它与前面的I或P帧和后面的P帧之间的预测误差及运动矢量; 
B帧是双向预测编码帧; 
B帧压缩比最高,因为它只反映并参考帧间运动主体的变化情况,预测比较准确; 
B帧不是参考帧,不会造成解码错误的扩散。

GOP详解

从定义上来说,GOP的长度是两个“相邻”I帧之间的帧的数目。
在这里插入图片描述
通过增加GOP的长度,整个视频中的I帧数目将会减少,由于I帧在编码数据量上比P帧大,因此更长的GOP能够有效减少视频编码数据量,进而减少带宽占用和存储内存占用(反映在比特率和视频文件大小)。

因此在需要减少比特率的应用场景下,可以尝试增大GOP的长度。更大长度的GOP对视频场景变化较少的(如固定场景监控)尤为有效,可以极大节省带宽节约存储。

另外需要注意的是,GOP的设置需要与可变比特率(Variable Bit Rate (VBR) )模式结合使用,而不能在固定比特率(Constant Bit Rate (CBR))模式下使用。

在这里插入图片描述

FFmpeg中的GOP

默认情况下,使用FFmpeg库对视频进行编码,其会使用可变GOP,通过运动估计来判断当前编码帧是否需要重新设置为I帧,从而GOP会由此改变。如要查看视频的帧类型可以使用如下命令:

ffprobe -select_streams v -show_frames -show_entries frame=pict_type test.mp4

结果示例如下:

[FRAME]
pict_type=I
[/FRAME]
[FRAME]
pict_type=B
[/FRAME]
[FRAME]
pict_type=B
[/FRAME]
[FRAME]
pict_type=B
[/FRAME]
[FRAME]
pict_type=P
[/FRAME]

如果需要自行指定GOP设置,可以使用如下参数:

--keyint <integer> (x264)
-g <integer> (FFmpeg)
Keyframe interval, also known as GOP length. This determines the maximum distance between I-frames. Very high GOP lengths will result in slightly more efficient compression, but will make seeking in the video somewhat more difficult. Recommended default: 250

--min-keyint <integer> (x264)
-keyint_min <integer> (FFmpeg)
Minimum GOP length, the minimum distance between I-frames. Recommended default: 25

使用示例(设置GOP长度为24):

ffmpeg -i test.mp4 -c:v libx264 -g 24 out.mp4 (使用FFmpeg参数传参)

或

ffmpeg -i test.mp4 -c:v libx264 -x264-params keyint=24 out.mp4  (使用x264参数传参)

扩展应用:upload videos to Twitter

当上传视频至国外某特时,其会对所传视频进行格式和规则校验,其中之一就是GOP校验。如果一个视频中GOP长度过长,可能会报如下错误。

“Your video file is not compatible. Please see tips for uploading videos.” 

Web弹窗的信息看不出详细错误,通过API上传视频,可以得到更细的错误信息:

{
  "media_id": 69532000,
  "media_id_string": "69532019",
  "media_key": "7_69532019",
  "size": 2323023,
  "processing_info": {
    "state": "failed",
    "progress_percent": 100,
    "error": {
      "code": 3,
      "name": "UnsupportedMedia",
      "message": "Video GOP is too large. Largest number of frames allowed in one GOP: 512"
    }
  }
}

可以看到message显示GOP过长(大于512),因此需要在编码时设置GOP长度如200。

版权说明

本文为原创文章,独家发布在blog.csdn.net/TracelessLe。未经个人允许不得转载。如需帮助请email至tracelessle@163.com

在这里插入图片描述

参考资料

[1] Reduce Bandwidth Consumption by GOP Settings
[2] Group of pictures - Wikipedia
[3] 图像群组 - 维基百科,自由的百科全书
[4] Back to basics: GOPs explained - AWS Media Blog
[5] H264编码总结 - 简书
[6] x264 FFmpeg Options Guide - Linux Encoding
[7] Group of Pictures | Video Streaming Definition
[8] Unable to upload MP4 videos, gives error message: “Your media file could not be processed.” - Twitter API / Media APIs - Twitter Developers
[9] Need Help: Unable to upload MP4 videos on web or app, got error message: “Your video file is not compatible. Please see tips for uploading videos.” - Twitter API / Media APIs - Twitter Developers
[10]【持续更新】FFmpeg常用命令小结_TracelessLe的专栏-CSDN博客_ffmpeg 指令

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

TracelessLe

❀点个赞加个关注再走吧❀

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值