什么是 YUV

YUV是一种颜色编码格式,可以说YUV流媒体是原始流数据,大部分的视频领域都在使用。与RGB类似,但RGB更多的用于渲染时,而YUV则用在数据传输,因为它占用更少的频宽。当然,实时通讯为了降低带宽都会采用H264/H265编码。YUV的含义:Y代表亮度信息(灰度),UV分别代表色彩信息。YUV的常用名称有许多,例如YUV422、YUV420、YUV444等。

采样格式

YUV 后面常带着三个数字,其含义代表 YUV 信息在像素点中的分布状况,也就是采样格式

  1. YUV444 代表每个 Y 对应一组 UV,每个像素占3个字节。

    存放码流:Y0 U0 V0 Y1 U1 V1 Y2 U2 V2 Y3 U3 V3

  2. YUV422 代表每 2 个 Y 对应一组 UV

    存放码流:Y0 U0 Y1 V1 Y2 U2 Y3 V3

  3. YUV411 代表每 4 个 Y 对应一组 UI

    存放码流:Y0 U0 Y1 Y2 V2 Y3

  4. YUV420 代表每个像素独有一个 Y,每四个像素共享一个 U,每四个像素共享一个 V

以 YUV420 为例,Y 数据有效字节数为=Height×Width;U数据有效字节数=(Height/2)×(Width/2);V数据有效字节数=(Height/2)×(Width/2);

YUV420 是一类格式的集合,包含 I420、NV21 等不同格式,格式不同,YUV 的排列顺序也不同(Y 的顺序是一样的,UV 不一样)。官方将 YUV 三个平面都称为颜色平面(color plane)。Android 中使用 ImageProxygetPlanes() 方法可得三个平面。

NV21 是,planes[1] 是 UVU,planes[2] 是 VUV。

NV21 存储的 UV 数据是有冗余的,取 planes[1] 每一排的奇数字节可得所有 U 数据,取 planes[2] 每一排的偶数字节可得所有 V 数据。

存储方式

上面提到的 planes 是平面的,YUV 存储在三个独立的数组中。还有另外一种存储方式:packed(打包的),YUV 是连续交错存储的。

例如 YUY2 就属于 packed 类型,数据以第一个字节存放 Y0,第二个字节存放 U0,再 Y1、V0、Y1 等等,每四个字节,Y0 和 Y1 共用 U0、V0 分量,依次类推。

YUV 图像显示

显示 YUV 图像需要使用 OpenGl 库调用 GPU 资源。或者先将 YUV 图像转换为 RGB 图像。Android 提供了 YuvImage 将 YUV 数据转换成 jpeg 的方法,目前只支持 NV21 和 YUY2。这里编写一段测试代码眼见为实。

测试图片地址

先使用 ffmpeg 将 jpeg 图片转为 NV21 格式用于测试:

ffmpeg -i icon.jpg -s 960x960 -pix_fmt nv12 nv12.yuv

得到 yuv 格式图片 后,存放到手机目录下,然后编写测试代码:

val file = File(Environment.getExternalStorageDirectory().path + "/1dev/nv21.yuv")
if (file.exists()) {
try {
//从本地读取 yuv 图片字节数据
val fileInputStream = FileInputStream(file)
var data = ByteArray(fileInputStream.available())
fileInputStream.read(data)
fileInputStream.close()
//测试图片分辨率
val width = 960
val height = 960
//将 yuv 图片字节数据存放到 YuvImage 中
var yuvImage = YuvImage(data, ImageFormat.NV21, width, height, null)
val out = ByteArrayOutputStream()
//使用 compressToJpeg 将存储的 yuv 数据转化为 RGB 图像
yuvImage.compressToJpeg(Rect(0, 0, width, height), 50, out)
val imageBytes = out.toByteArray()
val bitmap = BitmapFactory.decodeByteArray(imageBytes, 0, imageBytes.size)
iv.setImageBitmap(bitmap)
} catch (e: FileNotFoundException) {
e.printStackTrace()
}
}

获得 bitmap 后就可以使用 ImageView 显示了。

到这里其实还只是 api 层面的使用,后续还应该深入了解 YUV 到 RGB 的转换原理。另外 YUV 视频渲染、OpenGL es 的使用等,后续再学习记录~

认识 YUV的更多相关文章

  1. 【视频处理】YUV与RGB格式转换

    YUV格式具有亮度信息和色彩信息分离的特点,但大多数图像处理操作都是基于RGB格式. 因此当要对图像进行后期处理显示时,需要把YUV格式转换成RGB格式. RGB与YUV的变换公式如下: YUV(25 ...

  2. ubuntu14.04 yuv文件的播放及视频信息的查看

    1.安装ffmpeg sudo add-apt-repository ppa:mc3man/trusty-media sudo apt-get update sudo apt-get install ...

  3. MATLAB读取一张RGB图片转成YUV格式

    1.读入照片 控制输出的标志定义 clc;close all;clear YES = 1; NO = 0; %YES表示输出该文件,请用户配置 yuv444_out_txt = 1; yuv444_o ...

  4. YUV格式介绍

    原文链接:http://www.cnblogs.com/azraelly/archive/2013/01/01/2841269.html YUV格式有两大类:planar和packed.对于plana ...

  5. 非交织YUV格式转换

    本文为自己写的从非交织yuv420转换出yuv444,yuv422h,yuv422v和手动裁剪422h,422v图片的代码 #include <fcntl.h> #include < ...

  6. 【Android】直播必备之YUV使用总结 —— Android常用的几种格式:NV21/NV12/YV12/YUV420P的区别

    说明 因工作方面接触到图像处理这一块,需要对手机摄像头采集的原始帧做Rotate或者Scale,但无奈对此的了解少之又少,于是网上搜了一顿,完事后将最近所学总结一下,以方便之后的人别踩太多坑. 首先想 ...

  7. 直接操作 SDL_Overlay YUV叠加上的像素

    根据这篇解码出yuv数据后 海思h264解码库 y,u,v数据全部存进数组内,          IntPtr y = _decodeFrame.pY;                 IntPtr ...

  8. EmguCV(OpenCV)实现高效显示视频(YUV)叠加包括汉字

    视频处理中,往往需要在上面增加文字包括汉字英文字母数字标点等,Emgu.CV/opencv 绘图 线面文字包括中文 这篇里也有相关介绍,但是这篇里根据逐像素修改rgb值的方法效率太低 查了很多资料,基 ...

  9. YUV RGB播放器 打开, 显示RGB数据

    可以查看RGB像素数据 可以通过菜单栏打开像素数据文件,也可以通过拖拽方式打开文件.如果文件名称中包含了“{w}x{h}”这样的字符串(例如“test_320x420.yuv”),系统会自动解析为该像 ...

  10. YUV与像素值之间的关系

    一幅彩色图像的基本要素是什么? 说白了,一幅图像包括的基本东西就是二进制数据,其容量大小实质即为二进制数据的多少.一幅1920x1080像素的YUV422的图像,大小是1920X1080X2=4147 ...

随机推荐

  1. 电脑装MySQL免安装版配置失败提示系统错误2怎么解决?

    一·准备工作 我下载安装的版本是:mysql-8.0.16-winx64(免安装版) 下载地址:https://www.mysql.com/ (官网地址)https://cdn2.lmonkey.co ...

  2. CentOS下关于集群同步/LB/HA 的尝试

    Zookepper 集群同步 下载解压 wget http://apache.fayea.com/zookeeper/stable/zookeeper-3.4.8.tar.gz tar xvf zoo ...

  3. Leetcode 021 Merge Two Sorted Lists

    摘要:Merge two sorted linked lists and return it as a new list. The new list should be made by splicin ...

  4. SQL Server 索引碎片整理

    索引碎片整理的四种方法: 1)删除索引并重建 2)使用 DROP_EXISTING 语句重建索引 3)使用 ALTER INDEX REBUILD 语句重建索引 4)使用 ALTER INDEX RE ...

  5. 大厂是如何用DevCloud流水线实现自动化部署Web应用的?

    DevUI是一支兼具设计视角和工程视角的团队,服务于华为云DevCloud平台和华为内部数个中后台系统,服务于设计师和前端工程师. 官方网站:devui.design Ng组件库:ng-devui(欢 ...

  6. moviepy音视频剪辑:mask clip遮罩剪辑、遮片、蒙版的作用以及其包含的构成内容

    ☞ ░ 前往老猿Python博文目录 ░ 在阅读moviepy的类ImageClip的构造方法代码时,对于其中涉及遮罩的处理没有理解,到处查找遮罩的资料没有查到,最后到moviepy的官网上尝试了一下 ...

  7. 第8.18节 Python类中内置析构方法__del__

    一. 引言 基本上所有支持OOP设计的语言都支持析构方法(也称析构函数),析构方法都是在对象生命周期结束时调用,一般用来实施实例相关生命周期内访问数据的扫尾工作,包括关闭文件.释放内存.输出日志.清理 ...

  8. 转:浅谈HTTP中Get、Post、Put与Delete的区别

    1.GET请求会向数据库发索取数据的请求,从而来获取信息,该请求就像数据库的select操作一样,只是用来查询一下数据,不会修改.增加数据,不会影响资源的内容,即该请求不会产生副作用.无论进行多少次操 ...

  9. PyQt(Python+Qt)学习随笔:QScrollArea滚动区域的alignment属性

    老猿Python博文目录 专栏:使用PyQt开发图形界面Python应用 老猿Python博客地址 滚动区域的alignment属性对应QScrollArea的alignment属性,用于控制滚动区域 ...

  10. Oracle10g安装

    1.下载链接:https://pan.baidu.com/s/1peD3iCTcE2Gg2cPNGLmLgQ 提取码:tjk4 一.ORACLE安装 WIN7.WIN10系统安装需要修改兼容性. 点击 ...