前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >什么是open-GOP,close-GOP

什么是open-GOP,close-GOP

作者头像
lcyw
发布于 2022-06-10 11:37:56
发布于 2022-06-10 11:37:56
97600
代码可运行
举报
文章被收录于专栏:machh的专栏machh的专栏
运行总次数:0
代码可运行

什么是open-GOP,close-GOP

H.264主要有五种编码帧:

代码语言:javascript
代码运行次数:0
运行
复制
IIDR帧)、i(非IDR I帧)、PP帧)、B(参考B帧)、b(非参考B帧)。
  1. IDR帧,NALU_type = 0x65。IDR帧是一种特殊的I帧,在解码IDR帧前,清空所有前后向参考缓冲区,IDR帧随后的所有帧不能参考IDR前面的任何帧。IDR帧是视频安全的随机访问点,找到一个IDR帧可以丢弃前面所有帧数据而正确解码。
  2. I帧是帧内预测帧,它的解码不依赖与任何其他帧。NALU_type = 0x61。有些解码器没有区分这两种I帧,将所有的i帧都缺省的认为是IDR帧,这样会造成解码错误。这两种i帧在open-GOP的结构中需要明确区分,而在close-GOP中可以视为相同。
  3. P帧 即前向预测编码图像帧,参考之前的I帧或P帧,NALU_type = 0x41。
  4. B帧 即双向预测编码图像帧,参考前向或/和后向I帧或P帧。B帧也可以作为参考帧,但一般不常用。B帧提供最高的压缩比,NALU_type = 0x21 或 0x01。

GOP参数

GOP(Group of picture 图像组),指两个I帧之间的所有帧结构。x264里面决定GOP长度的参数有i_keyint_max,i_keyint_min,i_scenecut_threshold,b_open_gop.

  • i_scenecut_threshold是场景切换概率值,x264会计算当前帧与前一帧的不同程度并得出一个值。如果这个值低于i_scenecut_threshold,那么就认为场景之间有切换,不能用前面的帧预测当前帧,需要插入一个帧内编码帧。较高的值会增加监测到“场景变换”的几率;i_scenecut_threshold=0,不监测场景切换。
  • i_keyint_max是IDR帧最大间隔 一般取帧率的4-10倍,即4-10秒一个I帧。这个值太小,码率会过高(I帧码率通常远大于PB帧)或者视频质量较差(牺牲质量赖降低码率);这个值太大,码率会低下来,但是会牺牲实时性,在用户实时接入的时候,需要等到第一个I帧才能正确解码,过大的 i_keyint_max会增加随机接入用户的等待时间。
  • i_keyint_min是当监测到一个场景切换,并且此时距离上一IDR帧的距离小于min-keyint则插入一个I帧,反之则插入一个IDR帧。

例如:

代码语言:javascript
代码运行次数:0
运行
复制
i_keyint_max = 10;
i_keyint_min = 3;
i_scenecut_threshold = 0;
代码语言:javascript
代码运行次数:0
运行
复制
F00 F01 F02 F03 F04 F05 F06 F07 F08 F09 F10 F11 F12 F13 F14 F15 F16 F17
IDR                                         ...                       IDR ...

每10帧强制一个IDR帧, 如果i_scenecut_threshold = 40; 并检测到F06场景切换则

代码语言:javascript
代码运行次数:0
运行
复制
F00 F01 F02 F03 F04 F05 F06 F07 F08 F09 F10 F11 F12 F13 F14 F15 F16 F17
IDR                                     IDR                                                                   IDR

发现一个场景切换,并且与前一个IDR距离大于i_keyint_min,插入IDR并重新计数IDR距离

如果i_scenecut_threshold = 40; 并检测到F02场景切换则

代码语言:javascript
代码运行次数:0
运行
复制
F00 F01 F02 F03 F04 F05 F06 F07 F08 F09 F10 F11 F12 F13 F14 F15 F16 F17
IDR            I                                                                    IDR

发现一个场景切换,并且与前一个IDR距离小于i_keyint_min,插入I帧并重新计数IDR距离

如果i_scenecut_threshold = 40; 并检测到F02 F07场景切换则

代码语言:javascript
代码运行次数:0
运行
复制
F00 F01 F02 F03 F04 F05 F06 F07 F08 F09 F10 F11 F12 F13 F14 F15 F16 F17
IDR            I                                IDR                                                                   IDR

第一个场景切换距离小于i_keyint_min插入I帧,第二个场景切换距离前一个I帧距离大于i_keyint_min,插入IDR帧,并从新计数

open-GOP

码流里面包含B帧的时候才会出现open-GOP。一个GOP里面的某一帧在解码时要依赖于前一个GOP的某些帧,这个GOP就称为open-GOP。有些解码器不能完全支持open-GOP码流,例如蓝光解码器,因此在x264里面open-GOP是默认关闭的。对于解码端,接收到的码流如果如下:

代码语言:javascript
代码运行次数:0
运行
复制
I0 B0 B1 P0 B2 B3...

这就是一个open-GOP码流(I帧后面紧跟B帧)。因此B0 B1的解码需要用到I0前面一个GOP的数据,B0 B1的dts是小于I0的。如果码流如下:

代码语言:javascript
代码运行次数:0
运行
复制
I0 P0 B0 B1 P1 B2 B3...

这就是一个close-GOP码流,I0后面所有帧的解码不依赖于I0前面的帧,I0后面所有帧的dts都比I0的大。如果码流是

代码语言:javascript
代码运行次数:0
运行
复制
IDR0 B0 B1 P0 B2 B3...

那个这个GOP是close-GOP,B0,B1虽然dst比IDR0小,但编解码端都刷新了参考缓冲,B0,B1参考不到前向GOP帧。

对于编码端,如果编码帧类型决定如下:

代码语言:javascript
代码运行次数:0
运行
复制
...P0 B1 B2 P3 B4 B5 I6

这就会输出open-Gop码流

代码语言:javascript
代码运行次数:0
运行
复制
P0 P3 B1 B2 I6 B4 B5...

B4 B5的解码依赖P3。如果编码帧类型决定如下

代码语言:javascript
代码运行次数:0
运行
复制
...P0 B1 B2 P3 B4 P5 I6

这样就不会输出open-GOP码流

代码语言:javascript
代码运行次数:0
运行
复制
P0 P3 B1 B2 P5 B4 I6...

两者区别在于I6前面的第5帧是设置为B帧还是P帧,如果一个GOP的最后一帧(上例中是第5帧)设置为B帧,这个码流就是open-GOP,设置为P帧就是close-GOP。由于B帧压缩性能好于P帧,因此open-GOP在编码性能上稍微优于close-GOP,但为了兼容性和少一些麻烦,还是把opne-GOP关闭的好。

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2020-11-11,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 音视频开发训练营 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
2 条评论
热度
最新
太详细了,感谢分享
太详细了,感谢分享
11点赞举报
回复回复点赞举报
推荐阅读
旋转的太极图,使用matlab打开绘图新世界
主要思路就是,先画两个大的半圆,拼成太极最外圈的圆,然后画两个小圆(小圆的位置可以自己多调几次,自己看的舒服就好),接着再画两个半圆,作为太极图中间的分割线。这样,太极的轮廓就画好了。
远方的星
2021/08/04
1K0
旋转的太极图,使用matlab打开绘图新世界
《FFmpeg从入门到精通》读书笔记(三)
FFmpeg本身不支持H.264的编码器,是由FFmpeg的第三方模块对其进行支持,当前常用的编码器为x264,所支持的像素格式主要包括以下几种(使用ffmpeg -h encoder=libx264进行查询)
全栈程序员站长
2022/09/13
1.2K0
X264 主要参数文档
关键帧(IDR-frames)之间的最大距离。类似分节符,压缩数据的起始点。没有任何帧能够跨越IDR-frames作为参考帧,IDR帧是I帧的一种。
reizhi
2022/09/26
1.1K0
音视频编解码技术(一):MPEG-4/H.264 AVC 编解码标准
H.264,通常也被称之为H.264/AVC(或者H.264/MPEG-4 AVC或MPEG-4/H.264 AVC)
全栈程序员站长
2022/09/07
1.3K0
音视频编解码技术(一):MPEG-4/H.264 AVC 编解码标准
音视频八股文(8)-- h264 AnnexB
H.264从1999年开始,到2003年形成草案,最后在2007年定稿有待核实。在ITU的标准⾥称为H.264,在MPEG的标准⾥是MPEG-4的⼀个组成部分–MPEG-4 Part 10,⼜叫Advanced Video Codec,因此常常称为MPEG-4 AVC或直接叫AVC。
福大大架构师每日一题
2023/06/09
6400
音视频八股文(8)-- h264 AnnexB
音视频八股文(8)-- h264 AnnexB
H.264从1999年开始,到2003年形成草案,最后在2007年定稿有待核实。在ITU的标准⾥称为H.264,在MPEG的标准⾥是MPEG-4的⼀个组成部分–MPEG-4 Part 10,⼜叫Advanced Video Codec,因此常常称为MPEG-4 AVC或直接叫AVC。
福大大架构师每日一题
2023/04/28
5580
x264编码器学习
x264编码库libx264实现真正的视频编解码,该编解码算法是基于块的混合编码技术,即帧内/帧间预测,然后对预测值变换、量化,最后熵编码所得。
用户6280468
2023/09/12
6460
x264编码器学习
视频技术快览 0x1 - 视频编码
视频编码是对一帧帧图像来进行的。一般彩色图像的格式是 RGB 的,即用红绿蓝三个分量的组合来表示所有颜色。但是,RGB 三个颜色是有相关性的,为了去掉这个相关性,减少需要编码的信息量,通常会把 RGB 转换成 YUV,也就是 1 个亮度分量和 2 个色度分量。
Cellinlab
2023/05/17
8850
视频技术快览 0x1 - 视频编码
H264之NALU解析
H.264从1999年开始,到2003年形成草案,最后在2007年定稿有待核实。在ITU的标准⾥称 为H.264,在MPEG的标准⾥是MPEG-4的⼀个组成部分–MPEG-4 Part 10,⼜叫Advanced Video Codec,因此常常称为MPEG-4 AVC或直接叫AVC:
用户6280468
2022/03/21
2.3K0
H264之NALU解析
音视频知识小结
前言 总结的一些音视频相关的知识,文末总结有传送门。 概念 协议层(Protocol Layer):该层处理的数据为符合特定流媒体协议规范的数据,例如http,rtmp,file等; 封装层(Format Layer):该层处理的数据为符合特定封装格式规范的数据,例如mkv,mp4,flv,mpegts,avi等; 编码层(Codec Layer):该层处理的数据为符合特定编码标准规范的数据,例如h264,h265,mpeg2,mpeg4等; 像素层(Pixel Layer):该层处理的数据为符合特定
落影
2018/04/27
1.6K0
音视频知识小结
Twitch如何实现转码器比FFmepg性能提升65%?(上)
文 / Jeff Gong, Sahil Dhanju, Chih-Chiang Lu, Yueshi Shen
LiveVideoStack
2021/09/02
1.5K0
Twitch如何实现转码器比FFmepg性能提升65%?(上)
腾讯V265编码器:给用户以完备的265体验
大家好,我是张贤国,毕业后长期从事于视频编码标准制定(HEVC、VVC),以及视频编码器(H.265)研发工作,2017年加入腾讯,主要负责视频编码研发相关工作。本次分享将重点介绍V265编码器的业务体验优化,包括码率控制优化以及业务适配相关的优化。主要内容可以分为三个部分,首先简单介绍V265的最新情况,然后重点讲解V265在码率控制方面所做的一些优化,最后会介绍V265编码器在业务落地过程中遇到的一些问题与解决方案。
LiveVideoStack
2019/09/17
4.8K0
腾讯V265编码器:给用户以完备的265体验
H.264/MPEG-4 AVC学习
H.264,又称为 MPEG-4 第10部分,高级视频编码(英语:MPEG-4 Part 10, Advanced Video Coding,缩写为 MPEG-4 AVC)是一种面向块的基于运动补偿的视频编码标准 。
全栈程序员站长
2022/11/04
1.2K0
H.264/MPEG-4 AVC学习
音视频压缩:H264码流层次结构和NALU详解
前面在讲封装格式过程中,都有一个章节讲解如何将H.264的NALU单元如何打包到TS、FLV、RTP中,解装刚好相反,怎么从这些封装格式里面解析出一个个NALU单元。NALU即是编码器的输出数据又是解码器的输入数据,所以在封装和传输时,我们一般处理对象就是NALU,至于NALU内部到底是什么则很少关心。甚至我们在编解码时,我们只需要初始化好x264编码库,然后输入YUV数据,它就会给你经过一系列压缩算法后输出NALU,或者将NALU输入到x264解码库就会输出YUV数据。
潇湘落木
2020/11/12
6.3K0
音视频压缩:H264码流层次结构和NALU详解
常见视频编码格式解析[通俗易懂]
MPEG2-TS(Transport Stream“传输流”;又称TS、TP、MPEG-TS或M2T)是用于音效、图像与数据的通信协定,最早应用于DVD的实时传送节目。 区别:   DVD节目中的MPEG2格式,确切地说是MPEG2-PS,全称是Program Stream(程序流),而TS的全称则是Transport Stream(传输流)。MPEG2-PS主要应用于存储的具有固定时长的节目,如DVD电影,可添加字幕等一些程序操作。而MPEG-TS则主要应用于实时传送的节目,比如实时广播的电视节目。   简单地说,将DVD上的VOB文件的前面一截cut掉(或者是数据损坏数据)就会导致整个文件无法解码,而电视节目是任何时候打开电视机都能解码(收看)的。所以MPEG2-TS格式的特点就是从视频流的任一片段开始都是可以独立解码。
全栈程序员站长
2022/09/28
4.9K0
常见视频编码格式解析[通俗易懂]
音视频编解码常用知识点
视频播放器播放一个互联网上的视频文件,需要经过以下几个步骤:解协议,解封装,解码视音频,视音频同步。如果播放本地文件则不需要解协议,为以下几个步骤:解封装,解码视音频,视音频同步。他们的过程如图所示。
全栈程序员站长
2022/09/14
1.9K0
音视频编解码常用知识点
视频花屏和卡顿原因(音视频基础)
大家晚上好,今天给大家分享一些关于音视频里面一些基础的知识点,基础知识点非常重要!
用户6280468
2022/03/21
2.9K0
视频编解码基础概念
音视频领域早期采用模拟化技术,目前已发展为数字化技术。数字化的主要好处有:可靠性高、能够消除传输及存储损耗,便于计算机处理及网络传输等。数字化后,音视频处理就进入了计算机技术领域,音视频处理本质上就是对计算机数据的处理。
叶余
2019/04/02
1.4K0
视频编解码基础概念
音视频基础
采样精度(采样深度):每个“样本点”的大小, 常用的大小为8bit, 16bit,24bit。
vitofliu
2021/07/05
2.5K0
H.264编码及AAC编码基础
本节重点讲解了 H.264 编码以及 AAC 编码,在对其进行讲解前先介绍了视频编码的实现原理。
Gnep@97
2023/09/10
1.2K0
H.264编码及AAC编码基础
相关推荐
旋转的太极图,使用matlab打开绘图新世界
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档