前言
在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 指令