H264编码 GOP组 以及 I帧 B帧 P帧 说明
2021/11/26 6:10:14
本文主要是介绍H264编码 GOP组 以及 I帧 B帧 P帧 说明,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!
H264
GOP
I帧 B帧 P帧 说明
H264
未压缩的码流:
Byte 字节单位的码流 = 640x480x1.5x15 = 691200 所有在网上传输的数据都是按照比特位计算的 所以要用 bit为单位 Bit位码流 = 640x480x1.5x15x8 = 55296000 即 55M
而 H264建议的 码流是 : 500kpbs
相比之下,被压缩了100倍。压缩比约为 1/100
帧率 = 15 :场景 实时通讯 开会之类的
帧率 = 30 : 场景 录制课程视频
帧率 = 60 - 120 :场景 电影院
500kbps≈0.5M
Kbps又称比特率,指的是数字信号的传输速率,也就是每秒钟传送多少个千位的信息(K表示千位,Kb表示的是多少千个位);Kbps也可以表示网络的传输速度,为了在直观上显得网络的传输速度较快,一般公司都使用kb(千位)来表示。
如果是KBps,则表示每秒传送多少千字节。1KByte/s=8Kbps(一般简写为1KBps=8Kbps)。ADSL上网时的网速是512Kbps,如果转换成字节,就是512/8=64KByte(即64千字节每秒)。
GOP
1秒 25帧, 帧与帧之间的间隔是 40毫秒
如果每秒25帧 那么时间久了 数据量会非常大,所以就对各个帧进行了分组,分组的准则就是各个帧的相关性,即做某个相同动作的帧 分为一组,如图 看望眼睛的各个帧分为一组,动作是一样的 望眼镜的角度可能有差异, 敲键盘动作的各个帧分为一组 虽然具体动作有差别 但是大体上都是同一类动作。所以每一个组都是描述同一个动作的细微差别,所以每个组中的视频帧是强相关的 该组就是 GOP :group of picture,不同组之间的视频帧是弱相关的
GOP中的各个视频帧差别很小
如下各个帧可以做这样的处理,他们的差别主要是 望眼镜角度不同 ,而背景图,和头发等信息都是一样的(这里的背景图是一样的 只是为了区分 用了不同的颜色),所以当我们进行计算的时候,完全可以把所有的背景图 用一张图片来表示,头发也可以用一张图表示。其余的细节 不同的细节 可以单独存储,如望眼镜的角度,下半身旋转角度等。这样GOP组视频帧 就可以被压缩的很小,只需要存储很小的数据就可以将原来的一组真 还原回来。这就是GOP的意义。
I帧 B帧 P帧 说明
I帧:我们常把 GOP 一组强相关视频帧中的的 第一帧视频帧作为 I帧,这个I帧又是一种特殊的I帧,叫做IDR帧,是一种特殊的I帧。对于I帧来说,不依赖于任何参考帧,属于帧内压缩技术,编码解码与其他帧无关系,自己编码解码。
而 B帧 与 P帧 都是依赖于 I帧的
P帧: 向前参考帧,即只有在前面的帧解码之后,才可以解码当前帧。P帧只参考前面,不参考后面。因为压缩,解码都与前面的帧有密切关系
B帧:双向参考帧,虽然B帧压力率最高,但是随之而来的问题也很明显,就是 很占用CPU,而且很耗时。随着B帧帧数越来越多,延迟性也会越大,对于实时通讯来说,是很忌讳的,实时通讯讲究快速。
所以在大多数实时通讯场景如 音视频议 在线教育等 都是使用 I帧 和 P帧,而不是用B帧。而在大量的音视频转码的服务中 会大量的使用B帧,就是为了减少存储空间!
IDR帧 : 解码器立即刷新帧
我们已经知道 GOP是对视频进行了若干的分组,分组之后,每一组之间他们是有明显的差别的。如果我们所有的视频是一串连续播下来,但是如果中间 某个地方出现了错误,那后面的视频就很难进行恢复了,因为是相互依赖的。而有了 IDR帧之后,当遇到IDR帧时,在解码器端,解码器会将缓冲区中的所有数据全部清空,全部重新来过,所以此时缓冲区中的第一针是IDR帧,一组GOP中的的第一帧是IDR帧,是关键帧,是帧内压缩,不依赖于其他帧。所以在缓冲区找到第一个IDR帧之后,后面再来的数据 就是都依赖于这个IDR帧,直到下一个IDR帧到来 即下一组GOP视频帧到来,如此就避免了错误的传播。
所以IDR帧起到了 防止错误传播的作用
一组GOP中 第一帧是 IDR帧,后面接着连续的三个B帧,在后面连着P帧,再接三个B帧,循环反复。
解码特点:
1 先解码I帧
2 解码第一个P帧
3 解码前三个B帧,这3个B帧依赖于 IDR帧和第一个P帧,只有IDR帧和第一个P帧解码完后,才能解码前三个B帧,而B帧与B帧之间是没有参考关系的,所以这就回扣到,前面所说的 B帧是前后参考帧,这里的前后,指的就是前面的IDR帧和后面的P帧,只有当前后参考帧解码后,才解码自己。
4 解码第二个出现的P帧
5 解码 再次连续的3个B帧,这里的3个B帧 依赖于 ,前后两个P帧,即第一个和第二个P帧。是他的前后参考帧。
注意 播放的顺序与解码顺序不同,虽然P帧相对于B帧是先解码,但是播放的帧的顺序 就是排列的顺序。当所有的帧解码完成之后,他们都成了一个一个的完整的图像,所以用播放器播放的时候,就是按照顺序播放即 I B B B P B B B P …
SPS 与 PPS : 参数数据,属于I帧的一部分,他俩一般同时出现,不会单独出现。出现在IDR之前
SPS:序列参数集,对帧组的参数设置。
PPS: 对GOP一组视频帧的 每一个图像的设置
这篇关于H264编码 GOP组 以及 I帧 B帧 P帧 说明的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!
- 2024-12-24MongoDB资料:新手入门完全指南
- 2024-12-20go-zero 框架的 RPC 服务 启动start和停止 底层是怎么实现的?-icode9专业技术文章分享
- 2024-12-19Go-Zero 框架的 RPC 服务启动和停止的基本机制和过程是怎么实现的?-icode9专业技术文章分享
- 2024-12-18怎么在golang中使用gRPC测试mock数据?-icode9专业技术文章分享
- 2024-12-15掌握PageRank算法核心!你离Google优化高手只差一步!
- 2024-12-15GORM 中的标签 gorm:"index"是什么?-icode9专业技术文章分享
- 2024-12-11怎么在 Go 语言中获取 Open vSwitch (OVS) 的桥接信息(Bridge)?-icode9专业技术文章分享
- 2024-12-11怎么用Go 语言的库来与 Open vSwitch 进行交互?-icode9专业技术文章分享
- 2024-12-11怎么在 go-zero 项目中发送阿里云短信?-icode9专业技术文章分享
- 2024-12-11怎么使用阿里云 Go SDK (alibaba-cloud-sdk-go) 发送短信?-icode9专业技术文章分享