音视频学习笔记——H264编码

✊✊✊🌈大家好!本篇文章主要记录自己在进行音视频学习 中,整理的部分H264编码相关的内容重点😇。

首先介绍了H264编码中图像帧 的3种类型、GOP概念以及编码中比较重要的宏块DCT变化量化等内容。


本专栏知识点是通过<零声教育>的音视频流媒体高级开发课程进行系统学习,梳理总结后写下文章,对音视频相关内容感兴趣的读者,可以点击观看课程网址:零声教育


🎡导航小助手🎡

1.H264简介

H.264从1999年开始,到2003年形成草案,最后在2007年定稿有待核实。在ITU的标准⾥称为H.264,在MPEG的标准⾥是MPEG-4的⼀个组成部分--MPEG-4 Part 10,

其也被称为高级视频编码(Advanced Video Coding,简称 AVC),是一种被广泛使用的高精度视频的录制、压缩和发布格式。该标准引入了一系列新的能够大大提高压缩性能的技术,并能够同时在高码率端和低码率端大大超越以前的诸标准。

2.图像帧的类型 (I 帧、 P 帧和 B 帧)

H264采⽤了独特的I帧、P帧和B帧策略来实现,,用于提升视频压缩效率、视频质量和视频恢复能力。

帧的分类 中⽂ 意义
I帧 帧内编码帧 intra picture I 帧通常是每个 GOP的第⼀个帧,经过适度地压缩,做为随机访问的参考点。
P帧 前向预测编码帧 predictive-frame 通过充分将低于图像序列中前⾯已编码帧的时间冗余信息来压缩传输数据量的编码图像,称为预测帧。需要参考其前⾯ 的⼀个I 帧或者P帧来⽣成⼀张完整的图⽚ 。
B帧 双向预测帧 bi-directional interpolated prediction frame 既考虑与源图像序列前⾯已编码帧,也顾及源图像序列后⾯已编码帧之间的时间冗余信息来压缩传输数据量的编码图像, 也叫双向预测帧。 要参考其前⼀个I或者P帧其后⾯的⼀个P帧来⽣成⼀张完整的图⽚。

解码时,先解码I帧,然后解码P帧,最后参考B前后 的帧来解码B帧。

3.GOP

  • 一个序列的第一个图像叫做 IDR 图像(立即刷新图像 ), IDR 图像都是 I 帧图像。在视频编码序列中,GOP 即 Group of picture 图像组 ),主要⽤作形容⼀个IDR 帧 到下⼀个IDR帧之间的间隔了多少个帧。
  • GOP 长度越大,视频压缩效率越高,但视频质量和视频流恢复能力也越差,反之亦
    然。
  • 直播,如果是一秒 25 帧,一般 gop 设置为 25, 50( 一般是帧率的倍数)
  • 不是直播流,B帧一般设置2帧连续 B 帧,以降低码率。

GOP越大,编码的 I 帧就会越少。相比而言, P 帧、 B 帧的压缩率更高,因此整个视频的编码效率就会越高。但是 GOP 太大,也会导致

IDR 帧距离太大,点播场景时进行视频的seek 操作就会不方便。

4.H264编码

H264除了实现了对视频的压缩处理之外,为了⽅便⽹络传输,提供了对应的视频编码和分片策略;

组(GOP, group of pictures)、⽚(slice)、宏块(Macroblock)这些⼀起组成了H264的码流分层结构;

H264将其组织成为序列 (GOP)、图⽚ (pictrue)、 (Slice)、宏块 (Macroblock)、⼦块 (subblock)五个层次。

4.1宏块

对于每一帧图像,是划分为一个个块进行编码,就是我们说的宏块。

宏块大小一般是16x16(H264 、VP8),32x32(H265 、VP9),64x64(H265 、VP9 、AV1),128x128 (AV1)。

宏块扫描

对于一个 YUV 图像,可以把划分成一个个 16x16 的宏块(以 H264为例), YUV 分量的大小分别是 16x168x88x8 。这里我们只对 Y 分量进行分析( U V 分量同理)。假设 Y 分量这16x16 个像素就是一个个数字,采用"之"字方式扫描每一个像素值,则可以得到一个"像素串"。

扫描像素值目的是为了编码。

4.2 DCT变换和量化

人眼对高频信息不太敏感 ,可以通过DCT变化和量化去除一些高频信息 。

量化 是在不降低视觉效果的前提下减少图像编码长度,减少视觉恢复中不必要的信息。

H264采用标量量化 技术,它将每个图像样点编码映射成较小的数值。

QP和Qstep

量化参数QP是量化步长Qstep的序号。

  • 对于亮度(Luma)编码而言,量化步长Qstep共有52个值,QP取值0-51
  • 对于色度(Chroma)编码,Q的取值0-39
  • QP取最小值0 时,表示量化最精细
  • 相反,QP取最大值51时,表示量化是最粗糙的。

Qstep

  • 让变换块的系数都同时除以一个值(量化步长,也就是 QStep),结果就是量化后的系数。
  • QStep 越大,得到量化后的系数就会越小 。
  • 相同的 QStep 值高频系数值相比低频系数值更小量化后就更容易变成 0
  • 解码的时候需要将量化后的系数乘以QStep 得到变换系数。

QP与Qsetp对应图

5.小结

首先介绍了H264编码中图像帧的3种类型,要理解,I帧、P帧和B帧解码时与显示顺序的区别,需先解码I帧,然后解码P帧,最后参考B帧前后的帧来解码B帧。

分清H264中序列 (GOP)、图⽚ (pictrue)、 (Slice)、宏块 (Macroblock)、⼦块(subblock)五个层次。

编码中需先通过帧内预测或者帧间预测去除空间冗余和时间冗余,然后进行DCT变化量化 ,去掉大部分高频信息 。这样能使熵编码时压缩率更高。

相关推荐
Larry_Yanan1 小时前
QML学习笔记(三十四)QML的GroupBox、RadioButton
c++·笔记·qt·学习·ui
im_AMBER1 小时前
杂记 14
前端·笔记·学习·web
oe10192 小时前
好文与笔记分享 Paris, A Decentralized Trained Open-Weight Diffusion Model
人工智能·笔记·去中心化·多模态
立志成为大牛的小牛2 小时前
数据结构——十七、线索二叉树找前驱与后继(王道408)
数据结构·笔记·学习·程序人生·考研·算法
大筒木老辈子3 小时前
MySQL笔记---C/C++访问MySQL数据库
数据库·笔记·mysql
张永清-老清3 小时前
每周读书与学习->初识JMeter 元件(五)
学习·jmeter·性能调优·jmeter性能测试·性能分析·干货分享·每周读书与学习
低音钢琴3 小时前
【从零开始构建性能测试体系-02】 Apache JMeter 取样器指南:从入门到精通
学习·jmeter·apache
im_AMBER3 小时前
Web 开发 27
前端·javascript·笔记·后端·学习·web
cimeo3 小时前
【C 学习】12.2-函数补充
学习·c#
菠萝吹雪ing3 小时前
GUI 自动化与接口自动化:概念、差异与协同落地
运维·笔记·程序人生·自动化·接口测试·gui测试