H.264 视频编码器 变换编码分析

2024-03-24 23:38

本文主要是介绍H.264 视频编码器 变换编码分析,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

H.264 视频编码器 变换编码分析

一. 变换编码分为两部分:变换,量化,以及在之后的重建环路中对应的反量化和反变换。
接下来对各部分进行分析
二. 变换

根据残差数据的类型不同,H264 High Profile中会使用到4种不同的变换:

  1. 采用 Intra4x4 预测模式和 Intra16x16 预测模式得到的亮度分量预测残差,使用4x4离散余弦变换(DCT);
  2. 采用 Intra8x8 预测模式得到的亮度分量预测残差使用8x8离散余弦变换(DCT);
  3. 采用 Inter 预测模式得到的亮度分量预测残差,如果预测模式块大小,小于等于8x8,则使用4x4离散余弦变换,否则编码器要在4x4和8x8离散余弦变换之间进行选择。
  4. 色度分量的预测残差全部使用4x4离散余弦变换。
  5. 其中,4x4哈达玛变换用于 Intra16x16 预测残差直流分量的二次变换;2x2哈达玛变换用于色度分量直流系数的二次变换
三. 原始数学原理:DCT变换原理

DCT变换是一种正交变换,因为具有良好的去相关性和压缩效果,并且有快速算法可以实现,因此在图像编码中被广泛使用。

但是由于变换矩阵C的变换系数中存在无理数,在编解码的计算过程中计算结果会带来误差,反变换和变换之前的结果会不一样带来误差。

在H. 264编码标准中,进行了整数变换的操作,并且可以不使用乘法操作,其中的一部分变换计算合并到量化过程中去。

四. H.264中的整数余弦变换

整数余弦变换的对象:

  1. 4x4子宏块的亮度分量
  2. 4x4子宏块的色度分量
1.变换

也就是说,4x4的残差亮度书看剧和2x2的残差色度数据需要进行二维变换,使得高频分量大多数为零,从而达到和DCT变换相似的数据压缩效果。
在这里插入图片描述
其中,Ef 矩阵中a=1/2,b=√(2/5).
这里的 圈乘 运算符表示对同一位置的两个矩阵元素做一次的乘法操作。这一部分运算被合并到量化和反量化中,确保了整数余弦变换和DCT变换有相似的压缩效果。因此在编码器的标准中,变换过程只包括括号内的操作:
在这里插入图片描述

2.反变换

在H.264标准中,反变换矩阵Cinv 并不是变换矩阵Cf的逆矩阵,而是进一步做了整数化处理。因此需要其他运算来保证反变换的正确性。在H264标准中这部分也同样被合并到量化,反量化的过程中完成,这样保证在反变换的过程中同样只使用加法和移位操作。

反变换矩阵Cinv如下:
在这里插入图片描述

3. 分层的二维整数余弦变换:直流分量增加hardmard变换

首先,对于4x4子宏块的残差做二维整数余弦变换
其次,对8x8色度块的直流分量和帧内预测的16x16宏块中的16个子宏块的直流分量进行hardmard变换。如下图所示:
在这里插入图片描述
这时由于在8x8的色度块和帧内预测模式的16x16亮度快中,每个子宏块的直流分量之间还有很强的相关性。对于这些子宏块的支流分量还要进行Hardmard变换来提高数据的压缩效率。

8x8色度块和帧内预测16x16亮度快的直流分量的hradmard变换矩阵分别为:
在这里插入图片描述
Hardmard逆变换矩阵和变换矩阵相同。

4. 针对高清晰视频领域的应用,提出对亮度快使用更大尺寸的整数余弦变换:8x8变换块

相对于4x4数据块的整数比那还,新的建议增加了8x8数据块使用整数余弦变换。与此对应,新的建议中,预测模式和量化部分也做了部分修改。

8x8数据块的整数余弦变换:
首先可以提高数据压缩的性能,因为在实际中8x8数据块的数据相关性比4x4的数据块相关性要高,因此压缩性能要更好,可以减少大约10%的比特率。
其次,8x8数据块的整数余弦变换有利于图像中的频率分量,可以提高图像显示细节。

这篇关于H.264 视频编码器 变换编码分析的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/843164

相关文章

kotlin中const 和val的区别及使用场景分析

《kotlin中const和val的区别及使用场景分析》在Kotlin中,const和val都是用来声明常量的,但它们的使用场景和功能有所不同,下面给大家介绍kotlin中const和val的区别,... 目录kotlin中const 和val的区别1. val:2. const:二 代码示例1 Java

Go标准库常见错误分析和解决办法

《Go标准库常见错误分析和解决办法》Go语言的标准库为开发者提供了丰富且高效的工具,涵盖了从网络编程到文件操作等各个方面,然而,标准库虽好,使用不当却可能适得其反,正所谓工欲善其事,必先利其器,本文将... 目录1. 使用了错误的time.Duration2. time.After导致的内存泄漏3. jsO

用js控制视频播放进度基本示例代码

《用js控制视频播放进度基本示例代码》写前端的时候,很多的时候是需要支持要网页视频播放的功能,下面这篇文章主要给大家介绍了关于用js控制视频播放进度的相关资料,文中通过代码介绍的非常详细,需要的朋友可... 目录前言html部分:JavaScript部分:注意:总结前言在javascript中控制视频播放

Python基于wxPython和FFmpeg开发一个视频标签工具

《Python基于wxPython和FFmpeg开发一个视频标签工具》在当今数字媒体时代,视频内容的管理和标记变得越来越重要,无论是研究人员需要对实验视频进行时间点标记,还是个人用户希望对家庭视频进行... 目录引言1. 应用概述2. 技术栈分析2.1 核心库和模块2.2 wxpython作为GUI选择的优

Spring事务中@Transactional注解不生效的原因分析与解决

《Spring事务中@Transactional注解不生效的原因分析与解决》在Spring框架中,@Transactional注解是管理数据库事务的核心方式,本文将深入分析事务自调用的底层原理,解释为... 目录1. 引言2. 事务自调用问题重现2.1 示例代码2.2 问题现象3. 为什么事务自调用会失效3

找不到Anaconda prompt终端的原因分析及解决方案

《找不到Anacondaprompt终端的原因分析及解决方案》因为anaconda还没有初始化,在安装anaconda的过程中,有一行是否要添加anaconda到菜单目录中,由于没有勾选,导致没有菜... 目录问题原因问http://www.chinasem.cn题解决安装了 Anaconda 却找不到 An

Spring定时任务只执行一次的原因分析与解决方案

《Spring定时任务只执行一次的原因分析与解决方案》在使用Spring的@Scheduled定时任务时,你是否遇到过任务只执行一次,后续不再触发的情况?这种情况可能由多种原因导致,如未启用调度、线程... 目录1. 问题背景2. Spring定时任务的基本用法3. 为什么定时任务只执行一次?3.1 未启用

C++ 各种map特点对比分析

《C++各种map特点对比分析》文章比较了C++中不同类型的map(如std::map,std::unordered_map,std::multimap,std::unordered_multima... 目录特点比较C++ 示例代码 ​​​​​​代码解释特点比较1. std::map底层实现:基于红黑

Spring、Spring Boot、Spring Cloud 的区别与联系分析

《Spring、SpringBoot、SpringCloud的区别与联系分析》Spring、SpringBoot和SpringCloud是Java开发中常用的框架,分别针对企业级应用开发、快速开... 目录1. Spring 框架2. Spring Boot3. Spring Cloud总结1. Sprin

Spring 中 BeanFactoryPostProcessor 的作用和示例源码分析

《Spring中BeanFactoryPostProcessor的作用和示例源码分析》Spring的BeanFactoryPostProcessor是容器初始化的扩展接口,允许在Bean实例化前... 目录一、概览1. 核心定位2. 核心功能详解3. 关键特性二、Spring 内置的 BeanFactory