当前位置: 首页 > news >正文

音视频图像篇 YUV-RGB

音视频图像篇 YUV-RGB

      • 1.基础概念
      • 2.RGB、YUV深入讲解
        • 2.0 RGB:红、绿、蓝三基色
        • 2.1 YUV:Y表示明亮度(luminance或luma),也就是灰阶值,U和V表示的则是色度(chrominance或chroma)
          • 2.1.1 YUV采样表示法
          • 2.1.2 YUV数据存储
        • 2.3 RGB和YUV的转换
        • 2.4 RGB和YUV转换(为什么解码出错显示绿屏?)
        • 2.5 YUV Stride对齐问题

1.基础概念

位深:是指在记录数字图像的颜色时,计算机实际上是用每个像素需要的位深表示,比如红色分量用8bit。
我们看到的彩色图片,都有3哥通道,分别为red,green,blue,透明度alpha。通常每个通道用8bit表示,8bit能表示256种颜色,所以可以组成256x256x256=16777216种颜色。这里的8bit就是位深。
每个通道的位深越大,能够表示的颜色值就越大,
帧率:在1秒钟时间里传输的图片的帧数,也可以理解为图片处理器每秒钟刷新几次。比如25fps表示一秒钟内有25张图片。
码率:视频文件在单位时间内使用的数据流量。比如1Mbps。
stride:指内存中每行像素所占的空间。为了时间内存对齐每行像素中所占的空间并不一定是图像的宽带。

2.RGB、YUV深入讲解

2.0 RGB:红、绿、蓝三基色

在这里插入图片描述

2.1 YUV:Y表示明亮度(luminance或luma),也就是灰阶值,U和V表示的则是色度(chrominance或chroma)

在这里插入图片描述
YUV是一种笼统的说法,针对其他的具体排列方式,可以氛围很多种具体的格式:
打包格式(packed):将每个像素的Y、U、V分量交叉并以像素点为单位连续的存放在同一数组中,通常几个相邻的像素组成一个宏像素(macro-pixel);
在这里插入图片描述

平面(planar):使用三个数组分开连续的存放Y、U、V三个分量,即Y、U、V存放在各自的数组中。
在这里插入图片描述

2.1.1 YUV采样表示法

YUV采用A:B:C表示法来描述Y,U,V采样频率比例,下图中黑点表示采样像素点分量,空心圆表示采样像素点的UV分量。主要分为YUV 4:4:4,YUV 4:4:2,YUV 4:2:0,这几种常用的类型。
在这里插入图片描述
(实心代表Y分量,空心代表UV分量)

2.1.2 YUV数据存储

下面以每个分量数据存储在一个char或byte中为例描述YUV的数据的存储方式。

  1. 4:4:4格式
    比如i444(yuv444)格式,对应ffmpeg像素表示AV_PIX_FMT_YUV444P

  2. 4:2:2格式
    在这里插入图片描述

  3. 4:2:0格式
    在这里插入图片描述
    4:2:0格式 NV12
    在这里插入图片描述
    4:2:0格式 其他参考
    在这里插入图片描述

2.3 RGB和YUV的转换

通常情况下RGB和YUV直接的相互转换都是通过接口调用实现,比如ffmpeg的swscale或者libyuv等库。
在这里插入图片描述

2.4 RGB和YUV转换(为什么解码出错显示绿屏?)

在这里插入图片描述

2.5 YUV Stride对齐问题

比如分辨率638x480的YUV420P图像,我们在内存处理的时候如果以16字节对齐,则638不能被16整除,我们需要在每行尾部补充2个字节。就是640。此时该图片的Y stride为640字节![](https://img-blog.csdnimg.cn/fec3f963becc42bc8ad348d499123d99.png

相关文章:

  • 【Python 实战基础】Pandas如何从字符串中解析某一数据,并统计多于一次的该数据
  • Bus:消息总线
  • SpringBoot - 用maven-dependency-plugin插件将项目代码与依赖分开打包
  • 一文学会如何使用适配器模式
  • 计算机网络原理 谢希仁(第8版)第四章习题答案
  • Linux入门第三天——linux命令(二)
  • 为什么要在单片机程序中使用结构体和指针
  • ROS1云课→19仿真turtlebot(stage)
  • VL1_四选一多路器(完整RTL、Testbench和覆盖率)
  • 【fiddler学习笔记】——安装、原理、使用
  • Idea无法引入@Test 或@Test引入报错【BUG解决】
  • Java中常见包装类型Integer、BigDecimal等特点说明
  • 渗透测试-apt攻击与防御系列-利用WinRAR跨目录获取Net-NTLM Hash和DLL劫持
  • MySQL的多表查询
  • Linux下udev应用
  • [译] React v16.8: 含有Hooks的版本
  • 2017 年终总结 —— 在路上
  • 2018天猫双11|这就是阿里云!不止有新技术,更有温暖的社会力量
  • Date型的使用
  • leetcode46 Permutation 排列组合
  • Python 使用 Tornado 框架实现 WebHook 自动部署 Git 项目
  • Redash本地开发环境搭建
  • Vue2.x学习三:事件处理生命周期钩子
  • vue学习系列(二)vue-cli
  • Work@Alibaba 阿里巴巴的企业应用构建之路
  • 案例分享〡三拾众筹持续交付开发流程支撑创新业务
  • 大数据与云计算学习:数据分析(二)
  • 每天一个设计模式之命令模式
  • 如何利用MongoDB打造TOP榜小程序
  • 深度解析利用ES6进行Promise封装总结
  • 试着探索高并发下的系统架构面貌
  • 数据科学 第 3 章 11 字符串处理
  • 思维导图—你不知道的JavaScript中卷
  • 用Node EJS写一个爬虫脚本每天定时给心爱的她发一封暖心邮件
  • 云大使推广中的常见热门问题
  • 责任链模式的两种实现
  • AI又要和人类“对打”,Deepmind宣布《星战Ⅱ》即将开始 ...
  • 格斗健身潮牌24KiCK获近千万Pre-A轮融资,用户留存高达9个月 ...
  • ​LeetCode解法汇总2304. 网格中的最小路径代价
  • # Java NIO(一)FileChannel
  • # Maven错误Error executing Maven
  • #ifdef 的技巧用法
  • #Linux杂记--将Python3的源码编译为.so文件方法与Linux环境下的交叉编译方法
  • #NOIP 2014#Day.2 T3 解方程
  • #在线报价接单​再坚持一下 明天是真的周六.出现货 实单来谈
  • ()、[]、{}、(())、[[]]等各种括号的使用
  • (C语言)strcpy与strcpy详解,与模拟实现
  • (LeetCode) T14. Longest Common Prefix
  • (ros//EnvironmentVariables)ros环境变量
  • (博弈 sg入门)kiki's game -- hdu -- 2147
  • (层次遍历)104. 二叉树的最大深度
  • (二)hibernate配置管理
  • (附源码)计算机毕业设计SSM智慧停车系统
  • (过滤器)Filter和(监听器)listener
  • (蓝桥杯每日一题)平方末尾及补充(常用的字符串函数功能)