【H.264/AVC视频编解码技术详解】十六:帧内预测编码的基本原理

2023-11-02

《H.264/AVC视频编解码技术详解》视频教程已经在“CSDN学院”上线,视频中详述了H.264的背景、标准协议和实现,并通过一个实战工程的形式对H.264的标准进行解析和实现,欢迎观看!

“纸上得来终觉浅,绝知此事要躬行”,只有自己按照标准文档以代码的形式操作一遍,才能对视频压缩编码标准的思想和方法有足够深刻的理解和体会!

链接地址:H.264/AVC视频编解码技术详解

GitHub代码地址:点击这里


在前面的博文中所述,视频信息中通常包含的冗余有三种:空间冗余时间冗余统计冗余。处理这三种冗余信息通常采用不同的方式:

  • 空间冗余采用帧内预测编码压缩;
  • 时间冗余采用运动搜索和运动补偿压缩;
  • 统计冗余采用熵编码压缩。

在上述的各种编码技术中,帧内预测是非常重要的一种。因为在各种视频帧类型中,I帧(包括IDR帧等)全部采用帧内预测,I帧的压缩比率通常比P和B帧更低,因此帧内预测编码的效率对视频整体平均码率具有较大影响。另一方面,I帧通常都会作为P/B帧解码过程中的参考帧,如果I帧的编码出现了错误,那么不仅仅是该I帧出现错误,参考该I帧的P/B帧也同样不能正确解码。

1. MPEG-1/MPEG-2帧内编码

在早期的视频编码标准中就已经存在了帧内编码的方法。如MPEG-1/MPEG-2等早期的标准中,帧的类型已经定义了I/P/B三种类型,分别表示帧内编码帧、预测编码帧和双向预测编码帧。然而在H.264/AVC之前的标准中,编码I帧时并未采用预测编码,只有编码P/B帧时采用了帧间预测编码。在MPEG-1/MPEG-2等编码标准中,I帧的编码采用的是DCT-RLC的方法进行编码。I帧编码的主要流程如下图:
在这里插入图片描述

由于未采用预测算法,这种帧内编码的压缩效率相对较低,后期已经不能适应整体提升压缩比率的要求。

2. 预测编码的基本原理

对于存在前后相关性的信息,预测编码是一种非常简便且有效的方法。此时预测编码输出的不再是原始的信号值,而是信号的预测值与实际值的差。预测编码如此设计的出发点在于,由于前后存在相关性,相邻信号存在大量相同或相近的现象,通过计算其差值,可以减少大量保存与传输原始信息的数据体积。

我们用几个简单的例子来说明这个问题。假设有下面的一串数字:

1, 1, 1, 1, 1, 2, 1, 1, 1, 1, 1, 3

我们可以用如下的信息来表示这串数字信息:

Pred = 1;
Residual = { (1, 5), (2, 11) };

这些信息表示,目标信号的预测值为1,在第5和12个元素的位置存在残差,分别为1和2。

我们举另外一个例子,假设有下面一串数字:

0, 1, 2, 3, 5, 5, 6, 7, 8, 9, 10, 9, 12

对于这部分信号,可以如下表示:

Pred = n;
Residual = {(4, 1), (-2, 11)};

其表示的含义类似于前例。

从另一方面考虑,视频信息在输出码流之前需要经过量化操作。量化完成后的信息用数字化表示,其所需要的位数与表示信息的范围与方差有关。对于取值范围小、方差较小的信息,量化器所需要的比特范围就更小,每个像素数的比特位数便更小。统计表明,相比于原始的图像像素,预测残差的方差与动态范围远小于原始图像像素。通过预测编码,不仅降低了表示像素信息所需要的比特数,还可以保留视频图像的画面质量不至于降低。

3. H.264的帧内编码

在H.264/AVC中,帧内编码采用了全新的、更复杂的算法,相比早期标准的压缩比率大大提高。在H.264中采用的算法主要可分为预测编码模式和PCM编码模式。

2.1 H.264帧内预测编码

预测编码并非H.264最先采用的技术。在早期的压缩编码技术中便采用了预测数据+残差的方法来表示待编码的像素。然而在这些标准中预测编码仅仅用于帧间预测来去除空间冗余,对于帧内编码仍然采用直接DCT+熵编码的方法,压缩效率难以满足多媒体领域的新需求。H.264标准深入分析了I帧中空间域的信息相关性,采用了多种预测编码模式,进一步压缩了I帧中的空间冗余信息,极大提升了I帧的编码效率,为H.264的压缩比取得突破奠定了基础。

H.264的帧内预测算法通常可以分为三种情况讨论:4×4的亮度分量预测、16×16的亮度分量预测、色度分量预测。我们分别讨论这三种情况的算法原理。

2.1.1 4×4亮度分量预测

对于每一个帧内预测宏块,其编码模式可以分为I_4x4和I_16x16两种。对于I_4x4模式,该宏块的亮度分量被分为16个4×4大小的子块,每一个4×4大小的子块作为一个帧内预测的基本单元,针对每一个4×4像素块进行过预测与编码。

帧内预测会参考每一个像素块的相邻像素来构建预测数据。对于某一个4×4的子块而言,该子块上方4个、右上方4个、左侧4个以及左上方顶点的1个像素,共13个像素会作为参考数据构建预测块。预测块同参考像素的位置关系如下图所示:
在这里插入图片描述

在上图中,a~p表示预测块中的像素,A/B/C/D表示上方参考像素,E/F/G/H表示右上方的参考像素,I/J/K/L表示左方参考像素,Q表示左上方的参考像素。对于4×4亮度分量的帧内预测,共定义了9种不同预测模式。

模式0:垂直模式

在这里插入图片描述
在该模式下,每一个预测块的预测值由上方相邻的4个像素预测得到;

模式1:水平模式

在该模式下,每一个预测块的预测值由左方相邻的4个像素预测得到;

模式2:DC模式

在这里插入图片描述

该模式下,用上方和左方相邻像素的均值表示整个预测块;

模式3:左下模式

在这里插入图片描述

模式4:右下模式

在这里插入图片描述

模式5::右垂直模式

在这里插入图片描述

模式6:下水平模式

在这里插入图片描述

模式7:左垂直模式

在这里插入图片描述

模式8:上水平模式

在这里插入图片描述

2.1.2 色度分量与16×16亮度分量

模式0:垂直模式

在这里插入图片描述

模式1:水平模式

在这里插入图片描述

模式2:均值模式

在这里插入图片描述

模式3:平面模式

在这里插入图片描述

2.2 H.264的I_PCM编码模式

除了帧内预测编码之外,H.264还定义了一种特殊的编码模式,即为I_PCM模式。I_PCM模式不对像素块进行预测-变换-量化操作,而是直接传输图像的像素值。在有些时候(如传输图像的不规则纹理信息,或低量化参数条件下),该模式比预测编码模式效率更高

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

【H.264/AVC视频编解码技术详解】十六:帧内预测编码的基本原理 的相关文章

  • H.264 RTSP 绝对时间戳

    是否可以从安讯士摄像机通过 RTSP 发送的 H 264 流中读取绝对时间戳 有必要知道相机何时拍摄该帧 谢谢 安德里亚 正如拉尔夫已经说过的 RTP 时间戳与随机时钟相关 它们仅用于计算两个帧 或一般的 RTP 数据包 之间的差异 为了将
  • 使用 MediaCodec 和 MTK Codec 编码时选择 H264 Profile

    我们有一个 Android 应用程序 可以将视频编码为 H264 在所有以前尝试过的 Android 设备上 这都会编码为 Baseline 配置文件 这正是我所需要的 在 Lenovo Yoga 10 上 编解码器为 OMX MTK VI
  • Python Opencv 和 Sockets - 以 h264 编码的流视频

    所以我正在尝试制作一个流媒体 将视频从局域网上的一台计算机流式传输到另一台计算机 或目前同一台计算机 我需要它使用尽可能少的带宽 所以我尝试用 h264 进行编码 我在做这件事时遇到了困难 我真的不知道从哪里开始 现在它是用jpg编码的 并
  • h264 idea 比特流是如何组织的? / 标头起始码

    我试图通过使用十六进制编辑器查看视频文件的比特流来了解一些有关 h264 的知识 我发现here视频对象平面 0x000001b6 和 i 帧 0x000001b600 的起始码 但我在视频文件中找不到很多这样的字节 大多数情况下 这些起始
  • 通过 rtp 流发送 Android h264 捕获

    我正在为 android 编写一个 rtp 视频流媒体 它从 Android 本地套接字读取 h264 编码数据并将其打包 问题是我做到了 但我在客户端 Voip 不断收到黑框 通信过程如下 Android gt Asterisk gt J
  • 封装一个OpenH264 编解码H264视频文件的类

    下面是一个更新后的代码 增加了 H 264 编码的支持 在这个示例中 我使用了 OpenH264 的 ISVCEncoder 接口进行编码 请确保在项目中正确链接 OpenH264 库 并根据你的项目需要调整代码 include
  • Color_FormatSurface 实现

    是否有关于 Color FormatSurface AndroidOpaque 颜色格式的可用文档 我的视频编码器目前不支持这种格式 我应该添加该功能 但我找不到任何有关它的信息 任何帮助 将不胜感激 没有关于它的文档 因为它是不透明的 这
  • 通过 MP4 进行直播

    我正在从事在线电视服务工作 目标之一是无需任何额外的浏览器插件 Flash 除外 即可播放视频 我决定使用 MP4 因为大多数 HTML5 浏览器和 Flash 作为后备 都支持它 这些视频由 FFMpeg 从服务器上的 ASF 进行转码
  • 从 QuickTime MOV 文件解析 h.264 NAL 单元

    我正在尝试从 iPhone 上的 MOV 文件获取 h 264 NAL 单位 以便将 RTP h 264 视频从 iPhone 摄像头传输到服务器 Apple 的 API 不允许直接访问来自相机输出的编码比特流 因此我只能在写入 MOV 文
  • 如何对透明背景的视频进行编码

    我正在使用 OSX 的 cocoa 使用 AVAssetWriter 以 h264 编码视频 这是配置 Configure video writer AVAssetWriter m videoWriter AVAssetWriter all
  • 当输入分辨率为 1200x1600 时,通过 C-API 进行 ffmpeg 解码会导致伪影。难道我做错了什么?

    使用 C API 和 FFmpeg 5 1 我已经能够在 Android 上使用 libx264 对 h264 视频进行编码 现在我想在 Linux 上的 C 应用程序中重播它们 这些视频可以在浏览器或我尝试过的其他播放器 例如 ffmpe
  • ffmpeg 复制以保留时间戳

    我正在尝试修改 HLS 段传输流 并使用 ffmpeg 保留其开始时间 但是 即使提到了 copyts 输出也不会保留输入文件的 start time 值 这是我的命令行 ffmpeg i fileSequence1 ts i x png
  • 如何在没有 MediaExtractor 的情况下使用 MediaCodec 进行 H264

    我需要在没有 MediaExtractor 的情况下使用 MediaCodec 并且我正在使用 FileInputStream 读取文件 目前它不起作用 它在屏幕上显示绿色的乱码图像 这是整个源代码 FileInputStream in n
  • 解析 mdat MP4 中的 H264

    我有一个仅包含 MP4 容器中的 mdat 原子的文件 mdat中的数据包含AVC数据 我知道数据的编码参数 该格式似乎不是附件 B 字节流格式 我想知道我将如何解析这个 我尝试过搜索切片标题 但运气不佳 是否可以在没有 NAL 的情况下解
  • 直接从 numpy 进行 h.264 编码

    我想直接从视频帧的 numpy 数组中编码视频 Open cv 通过以下方式提供此类功能cv2 VideoWriter 但是我需要 h 264 编解码器 但该编解码器不可用 到目前为止 我最好的方法是使用 open cv 编写视频 然后通过
  • 我的视频没有关键帧,怎么可能?

    当我在视频上运行以下行时 它仅输出 P 帧和 B 帧 没有 I 帧 ffprobe select streams v show frames show entries frame pict type of csv 00000 MTS 视频怎
  • Html5 视频和 Flash 方法

    研究 HTML5 视频标签 并研究哪些浏览器支持哪些视频文件类型 我最初的想法是事情变得比仅仅使用 Flash 更困难 我想知道是否有人已经找到一些骨架代码 与视频的开发方法相结合 来执行以下操作 如果闪光灯可用 请使用它 如果没有 请尝试
  • Apple HLS 中的 PES 数据包内的访问单元如何对齐?

    Apple 是否指定了这一点 PES 数据包有效负载中应放置多少个访问单元 另外 我想知道 PES 数据包中存在哪些前缀起始代码 如果有 我认为访问单元中第一个 NAL 单元之前的单元是无用的 不能放置 正确的 我想知道它是如何在 HLS
  • H264 字节流到图像文件

    第一次来这里所以要温柔 我已经在给定的 H 264 字节流上工作了几个星期 一般注意事项 字节流不是来自文件 它是从外部源实时提供给我的 字节流使用 Android 的媒体编解码器进行编码 当将流写入扩展名为 H264的文件时 VLC能够正
  • 来自相机的 MediaCodec 视频流方向和颜色错误

    我正在尝试流式传输视频捕获直接从相机适用于 Android 设备 到目前为止 我已经能够从 Android 相机捕获每一帧预览帧 byte data Camera camera 函数 对数据进行编码 然后成功解码数据并显示到表面 我用的是安

随机推荐

  • 基于AT指令开发短信程序

    基于AT指令开发短信程序 本人的专职工作是做手机底层软件中SMS和CBS的功能模块软件 对SMS的PDU格式可以说是比较了解 在网上查找了一下感觉目前国内公开的软件大多功能比较单一 主要特点如下 1 支持分页短信 最大可以支持15个分页 可
  • Python利用selenium+Beautifulsoup破解动态class/id并提取相应文本的方法

    最近小白掌柜接了领导一项任务 要全程自动化的注册一个网站并登录网站后逗留一段时间再离开 起初觉得这个应该难度不会太大 就欣然接受了 谁知 拿到具体需求后一分析纳尼 这个里面其实有好多难点 but本着我就是进阶的小白还是决定挑战下去 今天先不
  • 【Python】如何在Python中绘制带有连接线的双饼图?

    文章目录 一 导入所需的库 二 准备数据 三 绘制双饼图 3 1 创建画布和子图对象 3 2 绘制大饼图 3 3 绘制小饼图 3 4 连接线1 连接大饼图的上边缘和小饼图的饼块 3 5 连接线2 连接大饼图的下边缘和小饼图的饼块 3 6 添
  • 强化学习笔记

    强化学习笔记 简介 本文是根据 Sutton的经典书籍 Reinforcement Learning An Introduction 前三章内容整理的笔记 枯燥预警 本文侧重对强化学习概念的理论分析 在基本概念上的剖析较为详细 也就是说会比
  • 深入剖析mmap原理 - 从三个关键问题说起

    作者 招财二师兄 链接 https www jianshu com p eece39beee20 来源 简书 著作权归作者所有 商业转载请联系作者获得授权 非商业转载请注明出处 对于mmap 您是否能从原理上解析以下三个问题 1 mmap比
  • 部署docker wsl下载ubuntu时报错无法从“https://raw.githubusercontent.com/microsoft/WSL/master/distributions/Dist

    挂科了个VPN好了 真是莫名其妙
  • 行列式求值、矩阵求逆

    include
  • CSS:渐变属性

    渐变属性 transition 值 参数1 定义需要渐变的属性 必填 常用值all 参数2 定义渐变需要的时间 必填 单位s 参数3 定义速度曲线 选填 默认ease慢快慢 常用linear匀速 参数4 定义效果延迟时间 选填 默认0 单位
  • SQL 注入漏洞(五)union 联合注入

    一 union 联合注入原理 联合查询注入是联合两个表进行注入攻击 使用关键词 union select 对两个表进行联合查询 两个表的字段数要相同 不然会出现报错 1 联合查询的错误方式 guestbook 表有三个字段 users 有八
  • 如何用logrotate管理每日增长的日志

    这篇文章主要介绍了如何用logrotate管理每日增长的日志问题 具有很好的参考价值 希望对大家有所帮助 如有错误或未考虑完全的地方 望不吝赐教 logrotate简介 logrotate is designed to ease admin
  • 2020秋招找工作总结

    找完工作闲了很久 现在还是想写点什么 留给未来的自己看看吧 本人双非 渣硕 面试岗位 C C 软件开放岗 嵌入式软件开放岗 从时间先后顺序面试了以下几家公司 网易游戏 雷火 广州腾讯 成都浦发银行 成都华为 成都汇顶科技 成都烽火 成都紫光
  • 昇腾应用案例体验:(5) 全目标结构化

    昇腾AI应用 探索人工智能的无限可能 使能千行百业 全目标结构化 概述 全目标结构化旨在处理海量视频 图像等机器无法理解的非结构化数据 从中挖掘潜在有价值信息并将其结构化存储 本例基于 mxVision 提供的插件以及自开发的目标挑选 人脸
  • Coins【暑期培训Z题】【多重背包】

    一道用来防AK的题 但是被我们给弄出来了 还是挺可以的 People in Silverland use coins They have coins of value A1 A2 A3 An Silverland dollar One da
  • Spring Boot + Vue的网上商城之商品信息展示

    Spring Boot Vue的网上商城之商品信息展示 当实现一个Spring Boot Vue的网上商城的商品信息展示时 可以按照以下步骤进行 后端实现 创建一个Spring Boot项目 并添加所需的依赖 包括Spring Web和Sp
  • gitlab中组的分类及权限介绍

    gitlab基本功能 gitlab是支持人员权限管理的 且在其内部支持分组规划 一般情况下的分组都会对应到研发部的各个部门 比如前端组 后端组 大数据组 数据分析组 测试组 运维组 当然以上的分组配置为一般中小互联网企业的人员架构 若是在大
  • WuThreat身份安全云-TVD每日漏洞情报-2023-05-10

    漏洞名称 Ppick CMS 远程代码执行 RCE 漏洞 漏洞级别 高危 漏洞编号 CVE 2023 25828 CNNVD 202303 2203 相关涉及 Pluck CMS 漏洞状态 POC 参考链接 https tvd wuthre
  • FFTW使用小结

    简介 FFTW Fastest Fourier Transform in the West 是由 MIT 的 Matteo Frigo 博士和 Steven G Johnson 博士开发的一个完全免费的软件包 FFTW 最初的 releas
  • npm install 提示 path xxx/node_modules/node-sass npm ERR! command failed 解决方法

    起因 近期要维护公司的一个后台 该后台是前人基于 go vue admin 开发 但是我前后经历了多次无法进行 npm install 每次安装依赖都出现类似于 path xxx node modules node sass npm ERR
  • Linux伪文件系统proc

    简介 proc文件系统是一个伪文件系统 用作内核数据结构的接口 它通常安装在 proc 其中大部分文件是只读的 但是有些文件允许更改内核变量 目录 1 常用文件 1 1 监控内存 1 2 监控网络 1 3 查看文件锁 1 4 系统统计数据
  • 【H.264/AVC视频编解码技术详解】十六:帧内预测编码的基本原理

    H 264 AVC视频编解码技术详解 视频教程已经在 CSDN学院 上线 视频中详述了H 264的背景 标准协议和实现 并通过一个实战工程的形式对H 264的标准进行解析和实现 欢迎观看 纸上得来终觉浅 绝知此事要躬行 只有自己按照标准文档