1 YUV格式

1.1 YUV简介

  YUV是一种颜色编码方式,类似于RGB颜色编码方式。YUV将亮度和色度分离,使用Y(明亮度)、U和V(色度、浓度)三个分量表示一个颜色。三个分量中UV分量只有颜色信息,如果图像只有Y分量图像就是黑白图像。一般见到YPbPr、YUV、Y’UV、YCbCr等专有名词描述的都可以成为YUV,不同的是他们使用的具体场景不同(YUV和Y’UV通常用来编码电视的模拟信号、YCbCr用来描述数字影像),在开发的过程中不需要严格区分他们。
  YUV利用人对图像的亮度信息更加敏感的特点,可以有针对性的对UV分量进行降采样。同时,YUV格式能够有效的兼容彩色电视和黑白电视,在过去黑白电视更加普及的情况下该种方式能够保证兼容性。YUV编码格式相比于RGB编码格式更适合于网络编码传输,但是需要注意的是显示设备的相识模式依然为RGB模式,只是中间需要一次转换。

1.2 不同的YUV采样格式

  YUV采样格式有:YUV444、YUV440、YUV422、YUV420和YUV411。采样格式是指按照比例降采样色度分量即UV分量,多个像素中公用一个UV分量来减少带宽。YUVABC格式中表示第一行数据中Y和UV分量采样比例为A:B,第二行数据的Y和UV的采样比例为A:C,而UV采样比例一直是1:1,以此方式不断重复。

  • 4:4:4表示完全取样。
  • 4:4:0表示1:1的水平取样,垂直2:1采样。
  • 4:2:2表示2:1的水平取样,垂直1:1采样。
  • 4:2:0表示2:1的水平取样,垂直2:1采样。
  • 4:1:1表示4:1的水平取样,垂直1:1采样。

  也就是说对于16像素8bit(每个像素的一个分量占用8bit)的图像:

  • YUV444占用3×16=48个字节;
  • YUV440占用16+2×2×4=32个字节,是YUV444的23\frac{2}{3}32​;
  • YUV422占用16+2×2×4=32个字节,是YUV444的23\frac{2}{3}32​;
  • YUV420占用16+2×2×2=24个字节,是YUV444的12\frac{1}{2}21​;
  • YUV411占用16+2×2×2=24个字节,是YUV444的12\frac{1}{2}21​;

  为了验证该猜想可以使用ffmpeg命令解码jpeg图像来查看大小:

#将图像缩放成100*100解码成对应的格式,将其中的422换成对应的采样格式就可以
ffmpeg -i .\1.jpg -s 100x100 -pix_fmt yuv422p 100x100_yuv422p.yuv

  对于YUV422格式图像的大小应该为100×100×3×23=20000100×100×3×\frac{2}{3}=20000100×100×3×32​=20000字节。

1.3 YUV存储格式

  YUV 数据有两种存储格式:平面格式(planar format)和打包格式(packed format)。

  • planar format:先连续存储所有像素点的 Y,紧接着存储所有像素点的 U,随后是所有像素点的 V。
  • packed format:每个像素点的 Y、U、V 是连续交错存储的。

1.4 YUV存储格式

  YUV根据不同的存储格式和不同的采样格式分为多种格式比如NV12,NV21,YUYV等格式,具体的格式后续用到的话会在这里补充。

1.5 读取YUV数据分离YUV分量

  这里使用YUV420P数据进行分离读取。

void split_yuv420p_yuv2file(const char *yuvfile, int height, int width, const char *yfile, const char *ufile, const char *vfile){FILE *yuvfp = fopen(yuvfile, "rb");FILE *yfp = fopen(yfile, "wb");FILE *ufp = fopen(ufile, "wb");FILE *vfp = fopen(vfile, "wb");if (!(yuvfp && yfp && ufp && vfp)) {return;}long long size = width * height;unsigned char *buffer = (unsigned char*)malloc(size * 3 / 2);fread(buffer, 1, size, yuvfp);fwrite(buffer, 1, size, yfp);fwrite(buffer + size, 1, size / 4, ufp);fwrite(buffer + size + size / 4, 1, size / 4, vfp);free(buffer);fclose(ufp);fclose(vfp);fclose(yfp);fclose(yuvfp);
}

  下面是解析出来的图像的yuv数据和Y分量数据。

2 RGB格式

2.1 简介

  RGB颜色模式就是使用R、G、B三原色表示颜色的一种编码格式,屏幕的显示方式基本都是RGB显示。RGB格式若按照编码存储方式可以分为RGB555、RGB565、RGB24(RGB888)和RGB32。格式不同是因为在构成一个像素的不同颜色所占的位数以及位数比例不同。

2.2 不同的格式

  • RGB555(高彩色)

    • R = color & 0x7C00, (获取高字节的5个bit)
    • G = color & 0x03E0, (获取中间5个bit)
    • B = color & 0x001F, (获取低字节5个bit)
  • RGB565(高彩色)
    • R = color & 0xF800, (获取高字节的5个bit)
    • G = color & 0x07E0, (获取中间6个bit)
    • B = color & 0x001F, (获取低字节5个bit)
  • RGB24(真彩色)
    • R = color & 0x000000FF
    • G = color & 0x0000FF00
    • B = color & 0x00FF0000
  • RGB32(真彩色)
    • 低8位保留

      • R = color & 0x0000FF00
      • G = color & 0x00FF0000,
      • B = color & 0xFF000000,
    • 低8位为ALPHA值
      • R = color & 0x0000FF00,
      • G = color & 0x00FF0000,
      • B = color & 0xFF000000,
      • A = color & 0x000000FF

3 RGB和YUV转换关系

  RGB和YUV的转换关系了解一下就行,具体实现有很多种为了保证画面没有色差和丢失的计算方式,可以参考YUV。

参考

  • yuv-wiki
  • YUV详解
  • 一文理解YUV
  • YUV色彩格式总结
  • 如何理解 YUV ?
  • 视音频数据处理入门:RGB、YUV像素数据处理

音视频基础之YUV格式相关推荐

  1. 音视频基础知识---像素格式RGB

    音视频基础知识汇总: 音视频基础知识---协议相关RTSP RTMP HLS 音视频基础知识---封装格式 音视频基础知识---视频编码格式 音视频基础知识---音频编码格式 音视频基础知识---像素 ...

  2. (一) 音视频基础_Mpeg4封装格式音视频编码格式_解封装解码_像素格式_PCM音频-采样率-通道-planar_MP4标准和h264格式的NAL的GOP分析

    封装:从文件中把音视频读出来 解码:将音视频解压出来 重采样:将音视频转换成声卡显卡支持的格式,视频需要做像素格式的转换MPEG(或叫MPEG-4)是一套用于音频﹑视频信息压缩的编码标准. MPEG- ...

  3. 音视频基础(三)WAV格式与PCM简介

    最近的工作涉及到语音识别相关的研究,因此先简单的梳理一下WAV格式和PCM.以前用c++实现了mp3 player,这个时候再来回顾下代码实现,将WAV的播放 看了下. 什么是PCM 直接上百度百科的 ...

  4. 【音视频基础】封装格式与编码数据

    音视频封装格式与编码数据 封装格式 封装格式的作用 MPEG-TS格式 FLV格式 封装格式分析 视频编码数据 H.264格式 音频编码数据 AAC格式 个人简介

  5. 音视频基础之封装格式与音视频同步

    封装格式的概念 封装格式(也叫容器)就是将已经编码压缩好的视频流.音频流及字幕按照一定的方案放到一个文件中,便于播放软件播放. 一般来说,视频文件的后缀名就是它的封装格式. 封装的格式不一样,后缀名也 ...

  6. 音视频基础知识---音频编码格式

    音视频基础知识汇总: 音视频基础知识---协议相关RTSP RTMP HLS 音视频基础知识---封装格式 音视频基础知识---视频编码格式 音视频基础知识---音频编码格式 音视频基础知识---像素 ...

  7. 音视频流媒体高级开发进阶:从音视频基础知识到技术实践

    站在音视频行业风口 站在风口,猪也能飞".在已经到来的2022年,音视频行业依旧是怎么也绕不过去的风口. 一方面,随着各项5G政策的落实,音视频+5G风口,将会深入挖掘音视频产业的无限潜力, ...

  8. ffmpeg音视频基础知识

    ffmpeg音视频基础知识 前言 一.图像的基础知识 二.视频编码基础知识 1.视频和图片之间的关系 2.为什么要编码? 3.什么是编码? 视频相关专业术语 提示:文章写完后,目录可以自动生成,如何生 ...

  9. 【音视频基础】视频基础理论

    [音视频基础]视频基础理论 图像基本概念 图像 屏幕 图像码流如何计算? 分辨率 帧率 码流计算 图像显示 YUV YUV格式 RGB与YUV的转换 YUV存储 YUV查看工具 参考资料 个人简介

  10. 音视频基础学习之【01.基于ffmpeg的简单播放器demo实现】

    目录 1.项目配置 2.显示界面设计 3.视频解码显示 流程描述 4.演示 最近在学习音视频基础知识,在这里感谢雷神留下的一系列指引新手入门的宝贵资源,虽然他英年早逝,但他的硕果永存.不由感慨真是天妒 ...

最新文章

  1. 界面Hello world
  2. mysql的topsql_TOP SQL监控之MySQL篇
  3. sql order by 降序_数仓面试|四个在工作后才知道的SQL密技
  4. 转 性能分析工具汇总
  5. 转载的孩子们注意节操哈!!!
  6. 【nyoj - 252】 01串(简单dp)
  7. 战神背光键盘如何关系_谁说轻薄和性能不可兼得?神舟战神Z7助你“清凉”一夏...
  8. java将a对象转换为b对象_Java 对象的深复制五种方式
  9. java 查找排序_数据结构(Java)——查找和排序(1)
  10. html小作业--新闻栏目
  11. python构建关键词共现矩阵
  12. Linux课程设计:Linux系统下多进程的创建与通信
  13. Ubuntu 16.04 双网卡 同时上内外网
  14. 《日本制造业白皮书(2018)》重磅发布!附400多页PPT
  15. √ JavaSE - 02.怎么打印回形数
  16. 808计算机基础考试时间,成都信息工程大学808计算机基础2020年考研大纲
  17. 如何设置默认浏览器?快速学会,简单易懂
  18. Java使用对象使用属性过滤集合对象重复数据
  19. 三分钟读懂:云计算与虚拟化的关系
  20. 全志 H6 Orange Pi Lite 2 Android 7.0 蓝牙配置

热门文章

  1. UCGUI信息处理机制
  2. Java性能优化攻略详解
  3. 解决kindle刷多看系统的问题
  4. 数学计算机sci,有哪些是数学类SCI
  5. 点分十进制转32位二进制数组
  6. steam密码文件在哪里_如何将您的Steam库无痛地移动到另一个文件夹或硬盘驱动器...
  7. JavaScript 原生Ajax
  8. 大学计算机基础总结与复习
  9. JSON-RPC是什么东西
  10. spring定时器的使用