视频编码知识

article/2025/10/15 20:39:25

记录一下学习视频编码的过程和自己的理解

视频

数字图像在计算机中的表示:二维矩阵,或三维矩阵(彩色)。

矩阵中的每个点为像素,数值的大小反应色彩的强度,颜色深度需要使用一定数据空间存储,每个色彩平面(RGB)常用为8bit,范围是0~255,那颜色深度就是24(8*3)bit。

分辨率:每英寸图像内有多少个像素点,分辨率主要包括:320 x 240、640 x 400、640 x 480、800 x 600、1024 x 768 1280 x 720(720P标清)、 1600 x 1200、1920 x 1080 (1080P全高清)

视频是单位时间内连续的n帧,n是帧率,单位是秒时等同于fps(frame per second)

播放一段视频每秒所需的数据量就是比特率(码率)单位是kb/s或Mb/s

比特率 = 宽 x 高 x 颜色深度 x 帧每秒

例如一段每秒30帧,分辨率是480x240的RGB视频,如果不做任何压缩,那码率为82944000(30x480x240x24)比特每秒。

一般来说同样分辨率下,视频的码率越大,说明表示像素的比特数越大,比特数大了就可以用来表示更细腻的颜色或画面信息,因此视频的压缩比越小,画面质量越高

巨大的数据量导致需要寻找一种方法保证人眼观感的同时尽可能压缩视频。

人眼的视觉特性:对亮度比色度更佳敏感

这张图能中的A B区域能反应人眼的视觉特性。

视觉特性
在这里插入图片描述

除了RGB颜色模型,还有其他模型,其中YCbCr可以将亮度(luma)和色度(chroma)分离,其中Y为亮度,Cb和Cr分别是蓝色色度和红色色度。

亮度色度分离在这里插入图片描述

分离亮度和色度之后,可以将色度部分进行压缩。称为色度子采样,表示为 a❌y

  • a: 水平采样参考,一般为4
  • x:第一行的色度样本数
  • y:第二行的色度样本数
    常用的方案有:4:4:4(没有子采样),4:2:2, 4:2:0 等。如果使用4:2:0采样,可以减少一半的视频大小。

视频中连续的帧之间存在很强的相关性,也就是说当前帧中的很多部分与上一帧中的部分有重叠,这样的冗余为时间冗余。消除时间冗余是有条件的,连续的几帧中要有关键帧,剩下的帧可以参考关键帧来消除冗余,因此我们需要对帧分类。

帧类型

I帧(关键帧):I帧是自足的帧,不需要其他任何信息渲染,它与静态图像相似,因此第一帧通常是I帧,I帧一般会定期被插入到帧序列中。
P帧(预测帧):P帧可以利用之前的帧渲染,比如连续两帧中只有一小部分发生了运动,那我们只需知道当前帧和前一帧的差值,就能重建当前帧。
B帧(双向预测):B帧相比P帧预测原理一样,只是B帧可以参考前向和后向的帧。

通常情况下,占用比特大小:I帧 > P帧 > B帧

帧间预测

用来去除时间上的冗余
假设有两帧图像
在这里插入图片描述
用0减去1,就可以得到残差,这样传输残差比直接传输图像本身的数据量要小的多。

但是整帧之间的残差还是比较大的,所以更好的方法是将图像分块
分块之后我们尝试匹配0和1中的块。
在这里插入图片描述
假设我们找到了匹配块,就是球会从(0, 25)移动到(7, 26),那么x,y的值也称运动矢量,类似于传输整帧的残差,我们可以只传输运动矢量x=(7-0),y=(26-25),可以进一步压缩。
例子

帧内预测

消除了帧间的冗余,帧内还是有冗余信息,比如这部分体现在图像内相同的颜色区域,或者重复出现的内容。

帧内可以使用块中左上侧的所有像素来预测
例子

假设我们预测出块中的颜色在垂直方向上保持一致,那我们就可以根据垂直方向的最上方一行的像素推测整个块中的像素值。这种方法可能会出错,所以我们还是利用残差信息,用 预测值-实际值=残差,来减少数据量。

编解码器

通俗讲就是用于压缩或解压 视频音频的软件或硬件,因为我们需要在有限的带宽或存储空间中提高视频的质量。

标准是指人们为了统一数字视频流传输,制定的将原始视频转换为另一种视频格式的规则

通用工作流程

1. 分块

首先要将帧分为很多宏块(Macro Blocks),分块是有依据的,在静态背景使用较大的块,而在复杂的部分使用更加细小的划分方式。

通常编码器会将分区组织成片(Slice),宏块(MB)和子分区
例子
在这里插入图片描述

2. 预测

根据上面所说的两种方法压缩,帧间预测需要传运动矢量和残差,帧内预测需要传送预测方向和残差。

3. 转换

得到残差后,还可以进一步去除部分像素而不影响整体质量,最常用的方法是离散余弦变换(DCT),这种变换可以分离数据高频和低频的部分,其中大部分能量集中在低频,因此丢掉部分高频信息就能减少数据量,但不会牺牲很多图像的质量。

4. 量化

量化是将连续的值转为有限的离散值,一个最简单的例子是均匀量化,取一个MB,将所有像素都除以10,那么块中的像素值都会减小,小的数意味着可以用更少的比特表示,但量化并不是无损的,由于除法运算之后会使用取整,会引入量化噪声。

这只是最简单的例子,并没有考虑系数的重要性,因此实际编码器中的量化一般表示为量化矩阵。

5. 熵编码

我们得到量化后的块之后,还可以继续编码,此时块中非零系数集中在低频部分,高频系数大部分是0。使用zig-zag扫描将kuai中的二维数据转换为一维,也就是一串非零值集中在前面,0集中在后面的数字。有两种编码方式

  1. CAVLC

  2. CABAC

6. 比特流格式

完成上述步骤后,就可以传输压缩后的数据了,其中包含了一些信息,比如,颜色深度,分辨率,块划分方式,运动矢量,帧内预测方向,档次,级别,帧率,帧类型,帧号等重要信息。在H.264中规定信息将在宏帧内传输,称为NAL层,此时的数据就是一大堆十六进制数,每个部分分别代表着原始视频在压缩过程中的信息

总结

视频编码的目的是为了在有限的带宽中提升视频质量,为了达到这一目的,编码器负责分析原始视频,去除视频中的冗余,其中包括帧内预测和帧间预测,原理是利用残差和关键帧的信息就可以恢复原始图像,之后使用DCT将数据转换到频域去除高频部分,此时视频已经变成使用小数值表示的,包含非0和0值的二维矩阵。最后使用熵编码得到十六进制的比特流,传输时将比特流和编码器使用的压缩方法一起传输,解码器根据比特流和不同的模式解码原始视频。


http://chatgpt.dhexx.cn/article/udoAZbp9.shtml

相关文章

视频的专业基础知识(一)常用的编码格式和参数

1. 常用的编码格式 编码格式:一个视频文件本身,通常由音频和视频两部分组成。例如视频文件,就是由avc视频编码AAC音频编码组成的,常见的视频编码格式有Xvid,AVC/H.264,MPEG1,MPEG2 等&#xff…

常见视频编码格式解析

常见视频编码格式解析 文章目录 常见视频编码格式解析1、MPEG2-TS编码技术1.1. MPEG-TS简介1.2. 基本概念及TS流概述1.3. 基本流程1.4. TS流传输包(简称TS包)结构分析1.4.1. TS包包头1.4.2. TS包净荷部分1.5. PS节目流2、MPEG-4编码技术2.1. MPEG-4概述2.2. MPEG-4各部分2.3.…

视频编码全流程

视频编解码用到的一些算法: 正反傅里叶变换、fft算法 dct变换、快速dct变换 如何自己实现一个视频编解码器: (1)取一帧作为I帧,类似jpeg压缩编码,也就是 rgb转yuv,然后dct去除高频信息。因为这种压缩会造成边界bloc…

视频编码技术详解

1、引言 如今我们所处的时代,是移动互联网时代,也可以说是视频时代。从快播到抖音,从“三生三世”到“延禧攻略”,我们的生活,被越来越多的视频元素所影响。 而这一切,离不开视频拍摄技术的不断升级&#x…

FIO源码解读测试

在磁盘测试中,fio是最常用的测试的工具,其下载网址为https://github.com/axboe/fio; 对于fio,其测试命令有许多,这个大家很容易就可以查到,此处不讲解具体的测试命令, 而是讲一下大概的源码框架。 Fio的入口函数在fio.…

fio引发的一些问题

fio引发的一些问题 奇怪的255扇区在nvme驱动中插入打印语句直接编译模块加载源码编译内核 查找内核源码 奇怪的255扇区 由于块设备驱动项目需要测试读写速度,故使用fio工具,没想着深入了解,简单测个速就可以 使用tldr命令得到测试磁盘读写的…

【fio】关于磁盘性能测试

一、关于磁盘 磁盘是可以持久化存储的设备,根据存储介质的不同,常见磁盘可以分为两类:机械磁盘和固态磁盘。 第一类,机械磁盘,也称为硬盘驱动器(Hard Disk Driver),通常缩写为 HDD。…

【测试】 FIO:ceph/磁盘IO测试工具 fio(iodepth深度)

目录 随看随用 NAS文件系统测试 块系统测试 FIO用法 FIO介绍 FIO 工具常用参数: FIO结果说明 I/O 的重放(录下实际工况的IO,用fio重放) fio工作参数可以写入配置文件 fio的iodepth参数说明 IO状态监控: Ios…

FIO详解

fio - Flexible IO Tester 一、服务器配置: 由于我们想通过fio得到SSD真实的参数信息,因此我们需要服务器BIOS一些参数的配合,以便能更好的体现硬盘的性能。 以华为1288HV5为例: 二、fio 1.安装 a.下载地址:htt…

FIO 存储性能压测

一、 FIO简介 FIO 是一个多线程IO生成工具,可以生成多种IO模式(随机、顺序、读、写四大类),用来测试磁盘设备的性能。GFIO是FIO的图形监测工具,它提供了图形界面的参数配置,和性能监测图像。 在github上的…

磁盘性能测试工具-FIO的安装及使用

文章目录 FIO介绍FIO安装在线安装离线安装 磁盘测试命令行方式测试结果说明命令参数说明配置文件方式 dd命令介绍使用方法 FIO介绍 FIO是一款测试IOPS的工具,用于对磁盘进行压力测试和验证,磁盘I/O是检查磁盘性能的重要指标,可以按照负载情况…

NuGet学习笔记(1)——初识NuGet及快速安装使用

http://kb.cnblogs.com/page/143190/ 1. NuGet是什么? NuGet is a Visual Studio 2010 extension that makes it easy to add, remove, and update libraries and tools in Visual Studio projects that use the .NET Framework. This topic lists documentation t…

Nuget路径问题

VS NetGet包管理器 问题场景: 装了两遍VS2019,第一次装D盘卸载了,然后装C盘,结果生成 .netCore项目时就悲剧了,报错:error MSB4018: “ResolvePackageAssets”任务意外失败。Microsoft.PackageDependencyResolution.t…

使用nuget 打包并上传 nuget.org

使用nuget 打包并上传 nuget.org 一、准备工作二、打包你的项目三、上传 nug.org 服务器 前言:今天又玩了个新东西,那就是 使用nuget 打包并上传 nuget.org,在这里即时记录一下,废话不多说,直接上教程。 一、准备工作…

nuget 的生成、发布、使用和更新

nuget 的生成、发布、使用和更新 一、nuget 的生成1.生成.dll1.1创建.net项目(类库)1.2 打包生成 .dll 2.打包成.nupkg文件2.1安装 [NuGetPackageExplorer.exe](https://github.com/NuGetPackageExplorer/NuGetPackageExplorer)程序2.2打开软件,完成打包…

修改NuGet包默认存放位置

默认情况下,NuGet下载的包存放在系统盘(C盘中),这样一来,时间长了下载的包越多,C盘占用的空间也就越多。 1、问题描述 默认情况下,NuGet下载的包存放在系统盘(C盘中,一般在路径C:\Users\用户\.nuget\packag…

Nuget使用简介

1.什么是Nuget Nuget是 ASP .NET Gallery 的一员。NuGet 是免费、开源的包管理开发工具,专注于在 .NET 应用开发过程中,简单地合并第三方的组件库。 当需要分享开发的工具或是库,需要建立一个Nuget package,然后把这个package放到…

Nuget的使用说明

在做项目的时候,经常需要添加一些第三方引用,Visual Studio 2019环境下,最推荐的是Nuget安装方式,好处就是可以将所有依赖的包全部打包下载安装。 1.nuget.org,搜索需要的nuget包,复制相应的安装命令&…

NuGet的了解

目录 1..NuGet 的使用目的 2..Net 的工具 NuGet 1.NuGet 包的下载 2.NuGet 包的分析 3.NuGet 的使用 1.通过命令行使用 2.在 visual studio 里通过图形化界面进行添加。 3.在添加包的时候 4.特点 1..NuGet 的使用目的 在引入第三方程序集(dll)的…

初识NuGet - 概念, 安装和使用

1. NuGet是什么? NuGet is a Visual Studio 2010 extension that makes it easy to add, remove, and update libraries and tools in Visual Studio projects that use the .NET Framework. This topic lists documentation that will help you use NuGet packages…