解码失败会显示绿屏,及yuv和rgb简单理解

简介: 解码失败会显示绿屏,及yuv和rgb简单理解

音视频图片相关基础:

1:rgb 红绿蓝 光的三原色

在RGB中,一幅图像有三个独立的图像平面或通道组成:红,绿,蓝(以及第四个通道透明度)。
   RGB(255,23,140)是光的三原色,也即红绿蓝Red、Green、Blue,它们的最大值是255,相当于100%。
     白色:rgb(255,255,255)
     黑色:rgb(0,0,0)
     红色:rgb(255,0,0)
     绿色:rgb(0,255,0)
     蓝色:rgb(0,0,255)
     青色:rgb(0,255,255)
     紫色:rgb(255,0,255)
  调整相关数字,便可以得到深浅不一的各种颜色

2:YUV (Y’CbCr) 一种像素格式,多用于视频编码/静态图像

Y(相当于灰度)的"亮度"分量           ===>表示亮度
      U(蓝色投影 Cb)和 V(红色投影 Cr)的"色度"分量   ===》表示颜色   ==》色度
    如果只有Y分量而没有UV分量,就是黑白(灰度)图像,兼容了彩色和黑白电视。
    注意:人眼对色度没有那么敏感。

3:YUV 存储方式: 平面格式, 半平面格式, 打包格式

平面格式(planar): 先存储所有的y分量,再存储所有的Cb分量,最后存储所有的Cr分量.

打包格式(packed): Y,Cb,Cr一起存储, ==》这里涉及一些存储方式,以n个样点为准依次存储。

半平面格式(semi planar): 先存储所有的Y分量,后面Cb和Cr分量一起存储.

4: YUV 种类:

空间间不同空间,即描述一个像素的bit数不同,比如yuv444,yuv422,yuv411,yuv420

==》主要从空间上理解,

如yuv444 表示y u v的个数都是4,

如yuv422,表示y u v的个数是4,2,2 (人眼对色度的不敏感,u和v交错去取)

空间内相同空间,即描述一个像素的bit数相同,但是存储方式不同

==》主要从固定像素上去理解:

比如对于yuv420而言,又可细分为yuv420p(yu16/yv16),yuv420sp,nv21,nv12,yv12,yu12,I420

5: 对yuv空间内存储的理解:

其实nv系列,都属于semi-plane系列
      这里nv12表示正常的顺序,即uv plane,先是u,然后是v
      而nv21表示相反的顺序,即uv plane,先是v,然后是u
    同样,nv16和nv61的区别也是仅仅是uv的次序而已。
  这里的12和16又代表什么呢?实际上代表的是一个像素所占的位数!
    以nv12为例,表示一个像素占用12bit,其中y是定死的占8bit,也就是u占2bit,v占2bit,实际上就是yuv420格式,具体而言是yuv420sp格式
    nv16,则表示一个像素占用16bit,其中y是定死的8bit,也即是u占4bit,v占4bit,实际上就是yuv422格式,具体而言是yuv422sp格式

6:为什么视频出问题(解码失败)的时候会显示绿屏?

注意: 在YUV全为0时,图像是绿色的。

图像中不同的颜色编码

1:YUV —》灰度(亮度)+色差分量

2:RGB —》RGB 三色分量

在YUV全0的时候,图片显示绿色

理解: 参考:https://www.fourcc.org/fccyvrgb.php
YUV和RGB的转换:
  Y = 0.299 R + 0.587 G + 0.114 B
  U = -0.1687 R - 0.3313 G + 0.5 B + 128
  V = 0.5 R - 0.4187 G - 0.0813 B + 128
  R = Y + 1.402 (V-128)
  G= Y - 0.34414 (U-128) - 0.71414 (V-128)
  B= Y + 1.772 (U-128)

将YUV的值全0带入公式中,可以得到:

R = 1.402 * (-128) = -126.598
  G = -0.34414(-128) - 0.71414(-128) = 44.04992 + 91.40992 = 135.45984
  B = 1.772 * (-128) = -126.228

差不多就是R = -126, G = 135, B = -126

其中RGB有取值范围, 都是[0, 255]

所以最后就是R=0, G=135, B=0

查看颜色表:rgb(0,135,0) 差不多就是绿色

参考:https://blog.csdn.net/nwpu053883/article/details/103733537

https://www.jianshu.com/p/6a361e86ccd5

目录
相关文章
|
18天前
|
存储 编解码 监控
RGB 和 YUV 区别
【10月更文挑战第26天】RGB和YUV在色彩表示原理、数据存储方式、应用场景以及转换关系等方面都存在着明显的区别,它们各自在不同的领域发挥着重要的作用。
|
存储 编解码 Android开发
NV21、NV12、YV12、RGB、YUV、RGBA、RGBX8888等图像色彩编码格式区别
NV21、NV12、YV12、RGB、YUV、RGBA、RGBX8888都是常见的图像颜色编码格式,它们之间的主要区别在于色彩空间和数据排列方式。
212 0
|
编解码 API 开发工具
NV21、NV12、YV12、RGB565、YUV等颜色编码格式区别和接口设计探讨
NV21、NV12、YV12、RGB565、YUV分别是不同的颜色编码格式,这些颜色编码格式各有特点,适用于不同的应用场景。选择合适的颜色编码格式取决于具体的需求和环境:
231 1
|
存储 编解码
ffmpeg解码提取帧RGB格式信息
使用ffmpeg和qt实现播放视频功能
310 0
C++实现对RGB图片进行编码
介绍了如何利用得到的RGB信息重新对RGB图片进行编码,以及对其他图片如BMP所得到的RGB信息进行编码从而得到*.jpg文件。
160 0
FreeSwitch中,RGB颜色转换为YUV
FreeSwitch中,RGB颜色转换为YUV
88 0
YUV 与 RGB的转换
RGB 转换成 YUV Y = (0.257 * R) + (0.504 * G) + (0.
5473 0
|
C++ 编解码
利用ffmpeg将H264流 解码为RGB
<p style="margin-top: 0px; margin-bottom: 0px; padding-top: 0px; padding-bottom: 0px; font-family: Arial; font-size: 14px; line-height: 26px;"></p> <pre name="code" class="cpp"><pre name="code" clas
4036 0
|
编解码
理解 RGB & YUV 颜色编码
理解 RGB & YUV 颜色编码
495 0
理解 RGB & YUV 颜色编码
使用FFMPEG的sws_scale函数实现各种原始颜色格式互转(YUV\RGB\)
使用FFMPEG的sws_scale函数实现各种原始颜色格式互转(YUV\RGB\)
854 0