很多人对YUV数据格式不清楚,以至于在做视频的时候出现了一些不可预知的错误(比如说图像带有点、颜色不对等)。今晚是周末放假,我就抽点时间来给大家介绍一下。

提示: 读下面的文字时,希望大家结合图片看,这样更易理解
       在YUV420中,一个像素点对应一个Y,一个2X2的小方块对应一个U和V。对于所有YUV420图像,它们的Y值排列是完全相同的,因为只有Y的图像就是灰度图像。YUV420sp与YUV420p的数据格式它们的UV排列在原理上是完全不同的。420p它是先把U存放完后,再存放V,也就是说UV它们是连续的。而420sp它是UV、UV这样交替存放的。(见下图)
有了上面的理论,我就可以准确的计算出一个YUV420在内存中存放的大小。
width * hight =Y(总和)
U = Y / 4  
V = Y / 4

所以YUV420 数据在内存中的长度是 width * hight * 3 / 2,

假设一个分辨率为8X4的YUV图像,它们的格式如下图:

YUV420sp格式如下图                                                                    YUV420p数据格式如下图

                  

有了上边的理论,我们可以对Android摄像头采集的YUV420sp数据做很多的转换,下面我写一个旋转90度的算法。

代码如下:

[java] view plain copy

  1. public static void rotateYUV240SP(byte[] src,byte[] des,int width,int height)
  2. {
  3. int wh = width * height;
  4. //旋转Y
  5. int k = 0;
  6. for(int i=0;i<width;i++) {
  7. for(int j=0;j<height;j++)
  8. {
  9. des[k] = src[width*j + i];
  10. k++;
  11. }
  12. }
  13. for(int i=0;i<width;i+=2) {
  14. for(int j=0;j<height/2;j++)
  15. {
  16. des[k] = src[wh+ width*j + i];
  17. des[k+1]=src[wh + width*j + i+1];
  18. k+=2;
  19. }
  20. }
  21. }

结合上面的旋转算法,我在Android平台写了一个测试项目。

运行结果效果如下:

上边视频是摄像头的预览数据(预览数据的图像截图看不见,郁闷啊),所以我为了能让大家看到效果,专门拍了一张照片。

                                                   

===========================================================================

关于yuv 格式

YUV 格式通常有两大类:打包(packed)格式和平面(planar)格式。前者将 YUV 分量存放在同一个数组中,
通常是几个相邻的像素组成一个宏像素(macro-pixel);而后者使用三个数组分开存放 YUV 三个分量,就像
是一个三维平面一样。

几种常见的yuv格式

1.YUV422 Planar

这里,Y\U\V数据是分开存放的,每两个水平Y采样点,有一个Cb和一个Cr采样点,如下图

ffmpeg 中的定义  PIX_FMT_YUV422P,   ///< planar YUV 4:2:2, 16bpp, (1 Cr & Cb sample per 2x1 Y samples)

android  OMX  中的定义  OMX_COLOR_FormatYUV422Planar     //*  YUV422Planar           : Three arrays Y,U,V.

2. YUV420 Planar

这个格式跟YUV422 Planar 类似,但对于Cb和Cr的采样在水平和垂直方向都减少为2:1,如下图

ffmpeg 中定义  PIX_FMT_YUV420P    //< planar YUV 4:2:0, 12bpp, (1 Cr & Cb sample per 2x2 Y samples)

android OMX 中定义  OMX_COLOR_FormatYUV420Planar     //  *  YUV420Planar           : Three arrays Y,U,V

3.YUV422 Semi-Planar                                         Semi 是’半‘的意思 我的理解这个半平面模式

这个格式的数据量跟YUV422 Planar的一样,但是U、V是交叉存放的,如下图。

ffmpeg 中 未找到定义

android  OMX  中 OMX_COLOR_FormatYUV422SemiPlanar    YUV422SemiPlanar       : Two arrays, one is all Y, the other is U and V

4.YUV420 Semi-Planar

这个格式的数据量跟YUV420 Planar的一样,但是U、V是交叉存放的,如下图。

ffmpeg 中定义

PIX_FMT_NV12,      ///< planar YUV 4:2:0, 12bpp, 1 plane for Y and 1 plane for the UV components, which are interleaved (first byte U and the following byte V)

android   OMX  中定义 OMX_COLOR_FormatYUV420SemiPlanar    //YUV420SemiPlanar       : Two arrays, one is all Y, the other is U and V

5.YUV422 Interleaved        Interleaved -- 交错

这个格式的数据量跟YUV422 Planar的一样,但是Y、U、V是交叉存放的,如下图。 这个是打包(packed)模式的

ffmpeg  中  PIX_FMT_UYVY422   ///< packed YUV 4:2:2, 16bpp, Cb Y0 Cr Y1

android  OMX 中  OMX_COLOR_FormatCbYCrY    //CbYCrY                 : Organized as 16bit UYVY (i.e. CbYCrY)

24bit RGB888 -> 16bit RGB565 的转换

24ibt RGB888 R7 R6 R5 R4 R3 R2 R1 R0 G7 G6 G5 G4 G3 G2 G1 G0 B7 B6 B5 B4 B3 B2 B1 B0

16bit RGB656 R7 R6 R5 R4 R3 G7 G6 G5 G4 G3 G2 B7 B6 B5 B4 B3

YUV422 YUV420 Planar \ Semi-Planar \ Interleaved格式详解相关推荐

  1. 安卓camera2 API获取YUV420_888格式详解

    安卓音视频开发中的一个环节是摄像头采集数据,Android平台上摄像头采集的API有两套,camera1和camera2.本文主要讲的是camera2这套API采集数据,并指明YUV420_888格式 ...

  2. Ffmpeg快速命令使用 Ffmpeg选项详解 Ffmepg格式详解 常见视频文件格式详解

    http://www.ffmpeg.com.cn/index.php/%E9%A6%96%E9%A1%B5 Ffmpeg快速命令使用 From Ffmpeg工程组 Jump to: navigatio ...

  3. YUV 格式详解-史上最全

    YUV 格式详解 介绍 分类标准 具体分类 I420(属于 YUV 420 Plannar) YV12(属于 YUV 420 Plannar) NV12(属于 YUV 420 Semi-Planar) ...

  4. ffmpeg-jpeg图片格式详解

    jpg/jpeg是24位的图像文件格式,也是一种高效率的压缩格式 JPEG格式可以分为 1.标准JPEG:只有图片完全被加载和读取完毕之后,才能看到图片的全貌 2.渐进式JPEG:(标准的改进)首先呈 ...

  5. 【图像处理】jpeg图片格式详解

    jpeg图片格式详解 1. JPEG文件简介 JPEG的全称是JointPhotographicExpertsGroup(联合图像专家小组),它是一种常用的图像存储格式, jpg/jpeg是24位的图 ...

  6. Java字节码(.class文件)格式详解(一)

    原文链接:http://www.blogjava.net/DLevin/archive/2011/09/05/358033.html 小介:去年在读<深入解析JVM>的时候写的,记得当时还 ...

  7. php serialize取值,PHP 序列化(serialize)格式详解

    PHP 序列化(serialize)格式详解(转) 1.前言 PHP (从 PHP 3.05 开始)为保存对象提供了一组序列化和反序列化的函数:serialize.unserialize.不过在 PH ...

  8. php serialize mysql_php 序列化(serialize)格式详解

    1.前言 PHP (从 PHP 3.05 开始)为保存对象提供了一组序列化和反序列化的函数:serialize.unserialize.不过在 PHP 手册中对这两个函数的说明仅限于如何使用,而对序列 ...

  9. 三维重建:PNG格式详解-与LibPNG使用

    PNG图像包含了骨骼信息,左边的图像比右边的大几十K,包含了骨骼信息:        PNG格式详解:https://blog.mythsman.com/post/5d2d62b4a2005d7404 ...

最新文章

  1. 送书啦!40本经典书籍任你挑!
  2. android:windowBackground 和 android:background 的区别
  3. 上高职业技术学校计算机学几年,上高职业技术学校2021年有哪些专业
  4. 关于分页插件PageHelper不起作用的问题
  5. tensorflow-yolov3 调试Intel Realsense D435摄像头所遇到的问题(USB自动检测并重置机制)hardware_reset() pyusb libusb devcon
  6. cmd复制.java并合并为.txt
  7. php屏蔽审查元素,HTML网站右键禁用F12代码 屏蔽审查元素 防止修改页面代码
  8. Telephone Linse(POJ-3662)
  9. 你以为你懂MySQL索引?阿里的面试官:你还太嫩!
  10. Android之GPU过度绘制与图形渲染优化
  11. Iptables 网络安全
  12. PreferenceActivity和PreferenceFragment对比
  13. 几种常用的数据校验(异常检测)总结(3σ、肖维勒准则、狄克逊准则、格拉布斯准则、皮尔士准则、卡方检验、T检验等等)
  14. 51单片机 1.概述及点灯测试
  15. MOTO me525 DEFY 2.2 刷机全程详细指导
  16. 新浪微博开发者创新基金开始接受申请
  17. java怎么给文件加密_java中如何给文件加密
  18. 【AI隐私保护.论文笔记】CrypTFlow2: Practical 2-Party Secure Inference,CrypTFlow2:实用的安全两方推理
  19. 查看android端BKS类型的证书库
  20. android 通知栏授权,Android 消息通知栏Notification使用和权限

热门文章

  1. swiper 上下居中
  2. Hummingbirdv2 E203 仿真排坑之路
  3. crmeb 商城微信公众号设置菜单说明
  4. 如何在Android模拟器中安装APK文件?
  5. android 模拟器 获得GPS
  6. 为荣耀4c语言设置在哪里设置方法,如何更改windows10语言设置在哪里设置
  7. javaEE进阶 - Spring 更简单的读取和存储对象 - 细节狂魔
  8. Centos 8 搭建时钟服务器
  9. Linux htop状态含义
  10. qsort对二维数组排序