音视频学习笔记——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变化量化 ,去掉大部分高频信息 。这样能使熵编码时压缩率更高。

相关推荐
音视频牛哥19 小时前
SmartMediaKit:如何让智能系统早人一步“跟上现实”的时间架构--从实时流媒体到系统智能的演进
人工智能·计算机视觉·音视频·音视频开发·具身智能·十五五规划具身智能·smartmediakit
Cathy Bryant19 小时前
概率论直觉(一):大数定律
笔记·考研·数学建模
摇滚侠20 小时前
Spring Boot3零基础教程,Reactive-Stream 四大核心组件,笔记106
java·spring boot·笔记
音视频牛哥20 小时前
超清≠清晰:视频系统里的分辨率陷阱与秩序真相
人工智能·机器学习·计算机视觉·音视频·大牛直播sdk·rtsp播放器rtmp播放器·smartmediakit
johnny23320 小时前
AI视频创作工具汇总:MoneyPrinterTurbo、KrillinAI、NarratoAI、ViMax
人工智能·音视频
✎ ﹏梦醒͜ღ҉繁华落℘20 小时前
FreeRTOS学习笔记(应用)-- 各种 信号量的应用场景
笔记·学习
星星火柴93620 小时前
笔记 | C++面向对象高级开发
开发语言·c++·笔记·学习
BeingACoder20 小时前
【SAA】SpringAI Alibaba学习笔记(一):SSE与WS的区别以及如何注入多个AI模型
java·笔记·学习·saa·springai
安全不再安全21 小时前
免杀技巧 - 早鸟注入详细学习笔记
linux·windows·笔记·学习·测试工具·web安全·网络安全
BreezeJuvenile21 小时前
外设模块学习(8)——HC-SR04超声波模块(STM32)
stm32·单片机·嵌入式硬件·学习·超声波测距模块·hc-sr04