深入理解视频编码:RGB与YUV格式、采样帧

devtools/2025/3/31 22:47:18/

图像格式

RGB格式

在这里插入图片描述

  • RGB 原理
    RGB(Red, Green, Blue)是一种基于加色模型的颜色编码方式,它通过组合不同强度的红色、绿色和蓝色光来产生各种颜色。在数字图像中,RGB 通常使用三个数值(每个颜色通道一个)来表示颜色,每个数值的范围通常是 0 到 255。
  • 优点
    直观:RGB 模型直接对应于显示设备(如显示器、电视)的工作方式,易于理解和使用。
    广泛支持:几乎所有的图像和视频格式都支持 RGB 颜色编码。
    缺点:
    不适合压缩:RGB 颜色编码包含完整的颜色信息,没有考虑到人眼对亮度和颜色敏感度的差异,因此在视频压缩和传输中效率不高。
  • 计算方式

RGB方式
对于一幅图像,一般使用整数表示方法来进行描述,比如计算一张的
RGB_888图像的大小为1280x720,可采用如下方式:一个像素点就是1b(1 b=8bit)

1280× 720 * 3 = 2.637 MB, 4分钟就达到了15G的容量。

假如是一部90分钟的电影,每秒25帧,则一部电影为
2.637MB90分钟60秒*25FPS= 347.651GB

YUV格式

在这里插入图片描述

  • YUV 原理
    YUV(Y, U, V)是一种基于人眼视觉特性的颜色编码方式,它将颜色信息分为亮度(Y)和色度(U、V)两部分。
    亮度(Y):表示图像的亮度信息,与人眼对亮度的感知直接相关。
    色度(U 和 V):表示图像的颜色信息,与人眼对颜色的感知相关,但敏感度较低

  • YUV格式

    • 对于planar的YUV格式,先连续存储所有像素点的Y,紧接着存
      储所有像素点的U,随后是所有像素点的V。
      在这里插入图片描述
    • 对于packed的YUV格式,每个像素点的Y,U,V是连续交*存储的
      在这里插入图片描述
  • YUV格式二
    看一下
    YUV 4:4:4采样,每一个Y对应一组UV分量。
    YUV 4:2:2采样,每两个Y共用一组UV分量。
    YUV 4:2:0采样,每四个Y共用一组UV分量

  • 在YUV 420格式中,数字420描述了色度抽样的模式,具体涉及到亮度(Y)和色度(U、V)分量的采样比例。这三个数字分别代表了Y、U和V三个分量的采样率。下面是每个数字的具体含义:

  • 第一个数字 “4”:
    代表亮度(Y)分量的采样率是每像素一个样本。这意味着对于图像中的每个像素点,都有一个Y分量的值,表示该像素的亮度信息。

  • 第二个数字 “2”:
    代表色度(U)分量的采样率是每两个像素一个样本。这意味着U分量的采样率是Y分量的一半,在水平方向上每两个像素共享一个U样本。

  • 第三个数字 “0”:
    代表色度(V)分量的采样率是每四个像素一个样本,或者说是每两个像素一行一个样本。由于V分量的采样率与U分量相同,这个数字通常被省略,所以YUV 420也常被简化为YUV 4:2:0。在4:2:0格式中,U和V分量在水平和垂直方向上的采样率都是Y分量的一半,即每四个像素共享一组UV样本。

取决最低的数字
YUV420P
上图是YUV420P 这个p代表U V代表不同平面
在这里插入图片描述
上图是YUV420SP 这个p代表U V代表同平面

相互转化

RGB 和 YUV 可以通过数学公式相互转换。转换过程涉及到颜色空间的变换,通常需要考虑具体的 YUV 变体(如 YUV 420、YUV 422 等)和 RGB 工作空间(如 sRGB、Adobe RGB 等)。

  • 从 RGB 到 YUV:
    转换公式通常涉及到加权求和,将 RGB 值转换为 YUV 值。
    例如,对于 YUV 420p 格式,转换公式可能如下:

Y = 0.299R + 0.587G + 0.114B
U = -0.14713R - 0.28886G + 0.436B
V = 0.615B - 0.51499G - 0.10001R
这些公式将 RGB 值转换为 YUV 值,其中 U 和 V 值通常需要进一步处理以适应色度子采样格式。

  • 从 YUV 到 RGB:
    转换过程是 RGB 到 YUV 的逆过程,需要考虑色度子采样的影响。
    例如,对于 YUV 420p 格式,转换公式可能如下:
    复制

R = Y + 1.13983V
G = Y - 0.39465U - 0.58060V
B = Y + 2.03211U
这些公式将 YUV 值转换回 RGB 值,以便于在显示设备上呈现。

视频解码失败时显示绿色屏幕而不是其他颜色,是因为在进行视频解码的过程中,主要使用到ffmpeg的由YUV到RGB的转换。当解码失败时,YUV分量的值会进行0填充。根据YUV到RGB的转换公式,可以得到RGB的取值,其中只有绿色分量值有效,因此显示为绿屏。在RGB的取值范围[0 - 255]中,转换后的RGB最终值是R = 0,G = 135.45984,B = 0,由于只有Green的分量值有效,所以显示为绿屏。

  • 总结
    RGB 和 YUV 是两种不同的颜色编码方式,各有优势和应用场景。RGB 直观且广泛支持,适用于显示和图像处理;YUV 适合视频压缩和传输,考虑了人眼视觉特性。在实际应用中,根据具体需求选择合适的颜色编码方式是非常重要的。

采样帧

采样帧的定义

  • 采样帧:从视频流中提取的单个图像帧,通常用于表示视频序列中的某一特定时刻。
    补充知识
  • 帧率(Frame Rate):指每秒钟显示的帧数,例如 24 fps(每秒24帧)、30 fps、60 fps 等。
  • 视频码率: kb/s, 是指视频文件在单位时间内使用的数据流量,也叫
    码流率。码率越大,说明单位时间内取样率越大,数据流精度就越高

文件大小可以通过码率/比特率和媒体的时长来估算。例如,一个音频文件的比特率是128 kbps,播放时长是4分钟(240秒),那么文件大小大约是:
128 kbps×240 秒=30720 kbits=3840 KB≈3.75 MB

  • 视频分辨率:分辨率就是我们常说的640x480分辨率、 1920x1080分辨
    率,分辨率影响视频图像的大小

采样帧的类型:(了解概念即可 编码协议要细讲)

  • I帧(Intra-frame):
    I帧是关键帧,属于帧内压缩,它不依赖于其他帧,包含了一帧图像的完整信息。I帧通常作为随机访问的参考点,可以单独解码成一张完整的图片。I帧的压缩比率相对较低,但提供了较好的视频质量。

I 帧(Intra coded frames) : I帧不需要参考其他画面而生成,解码时仅
靠自己就重构完整图像;
I帧图像采用帧内编码方式;
I帧所占数据的信息量比较大;
I帧图像是周期性出现在图像序列中的,出现频率可由编码器选择;

  • P帧(Predictive frame):
    P帧是前向预测编码帧,它通过参考前面的一个I帧或P帧来压缩传输数据量。P帧表示的是这一帧与之前的一个关键帧(或P帧)的差别,解码时需要用之前缓存的画面叠加上本帧定义的差别,生成最终画面。P帧没有完整的画面数据,只有与前一帧的画面差别的数据,因此解码时需要参考之前的帧。
  • B帧(Bidirectional frame):
    B帧是双向预测编码帧,它记录的是当前帧与前后帧的差别。要解码B帧,不仅要取得之前的缓存画面,还要解码之后的画面,通过前后画面的与本帧数据的叠加取得最终的画面。B帧压缩率高,但是解码时CPU的负荷会比较大,因为需要进行前后帧的对比。

http://www.ppmy.cn/devtools/172076.html

相关文章

02[FlareOn4]login

题目来源&#xff1a;tps://buuoj.cn/challenges 1&#xff0c;打开/login.html 获得一个输入框 ctrlu查看源码 <!DOCTYPE Html /> <html><head><title>FLARE On 2017</title></head><body><input type"text" name&qu…

Go 语言标准库中flag模块详细功能介绍与示例

Go语言的 flag 模块用于解析命令行参数&#xff0c;支持定义和解析各种类型的参数&#xff08;如字符串、整数、布尔值等&#xff09;。以下是 flag 模块的核心方法及示例说明&#xff1a; 1. 定义命令行参数 flag.String、flag.Int、flag.Bool 等 定义不同数据类型的命令行参…

elementplus的el-tabs路由式

在使用 Element Plus 的 el-tabs 组件&#xff0c;实现路由式的切换&#xff08;即点击标签页来切换不同的路由页面&#xff09;。下面是一个基于 Vue 3 和 Element Plus 实现路由式 el-tabs 的基本步骤和示例。 步骤 1: 安装必要的库 在vue3项目安装 Vue Router 和 Element …

【Elasticsearch基础】CRUD操作实践

Elasticsearch作为最流行的搜索和分析引擎&#xff0c;其核心CRUD&#xff08;创建、读取、更新、删除&#xff09;操作是每个开发者必须掌握的技能。本文将详细介绍Elasticsearch的基础数据操作&#xff0c;并提供可直接复用的curl示例。 1 创建索引与文档 1.1 创建索引 // …

程序员软件工具推荐列表

&#x1f91f;致敬读者 &#x1f7e9;感谢阅读&#x1f7e6;笑口常开&#x1f7ea;生日快乐⬛早点睡觉 &#x1f4d8;博主相关 &#x1f7e7;博主信息&#x1f7e8;博客首页&#x1f7eb;专栏推荐&#x1f7e5;活动信息 文章目录 程序员软件工具推荐列表1. Snipaste2. VSCod…

Python入门基础

python基础类型转换 str()与int()类型转换 name 张三 age 20 print(type(name),type(age))print(我叫name 今年&#xff0c; str(age)岁 )a10 b198.8 cFalse print(type(a),type(b),type(c)) print(str(a),str(b),str(c))s1 128 f198.7 s276.77 ffTrue s3hello print(type(s…

什么是索引下推和索引覆盖?

一、索引下推&#xff08;Index Condition Pushdown, ICP&#xff09; 1. 什么是索引下推&#xff1f; 核心思想&#xff1a;在存储引擎层&#xff08;如 InnoDB&#xff09;提前过滤数据&#xff0c;减少不必要的回表操作。通俗解释&#xff1a;假设你有一个联合索引&#x…

71. 我的第一个Linux驱动实验

一、字符设备驱动框架 字符设备驱动的编写主要就是驱动对应的open、close、read。。。其实就是 file_operations结构体的成员变量的实现。 其中关于 C 库以及如何通过系统调用“陷入” 到内核空间这个我们不用去管&#xff0c;我们重点关注的是应用程序和具体的驱动&#xff0…