视频基础知识-图像

310 阅读3分钟

视频:

  • 由一组图像组成
  • 为了传输/占用更小的空间而被压缩
  • 最终在显示设备上展示(未被压缩)

图像:

  • 由像素组成
  • 像素通过RGB展示出来(三个发光二极管, 通过调节亮度显示不同的颜色)
  • 分辨率: 宽高像素的乘积

每个像素的位深(用多少个位来表示一个像素):

  • RGB888 (24位) : 最常见,每个颜色占一个字节(8位)

  • RGBA (32位) : A(alpha 透明度)

图像于屏幕的关系:

  • 图像是数据

  • 屏幕是显示设备

  • 图像数据通过驱动程序让屏幕显示图像

RGB的色彩问题:

  • RGB与BGR : 三原色的排列顺序不一样, 向显示器输送的是BGR数据 而显示器当作RGB去渲染导致渲染出来的颜色有问题, 解决方法是 将BGR数据转换成RGB数据再交给显示器.

  • BMP使用的是BGR格式, 需要进行转换, 转换方法: ffmpeg:libswscale 或者自己写一个方法读出每一个像素点的值转换顺序再重新写入.

屏幕指标:

  • PPI (pixels per inch) : 屏幕在一寸长的距离内一共放了多少个像素点.越多说明密度越大, 则屏幕显示效果越好, 

  • DPI (Dots per inch) : 屏幕在一寸长的距离内的点数 , 点数大部分情况下是和像素一一对应的, 比较少的情况下一个点对应多个像素.

  • PPI > 300 就属于视网膜级别(人眼察觉不到像素点).

分辨率:

  • X轴的像素个数 * Y轴的像素个数

  • 常见的宽高比 16:9 / 4:3 , 当画面不是常规宽高比的时候 渲染就会出错, 所以渲染之前先转换尺寸.

  • 360P(640*360) / 720P(高清:1280*720) / 1K / 2K

帧率:

  • 每秒钟采集 / 播放图像的个数

  • 动画的帧率 25帧/秒

  • 常见帧率: 15帧/秒(满足实时通讯需求), 30帧/秒, 60帧/秒

未编码视频的RGB码流的计算:

RGB码流 = 分辨率(宽*高) * 3(Byte) * 帧率(25帧) , 3 : RGB 三个值.

例如 : 1280 * 720 * 3 * 25 = 69120000 约69M(字节B)(=*8位b) 

在不同的平台上都有哪些库用来高效的渲染视频???

YUV:

  • YUV (也称YCbCr) : Y表示明亮度, UV的作用是描述影像色彩及饱和度.

  • 主要的采样格式 : YUV4:2:0(所有的播放器都支持)、YUV4:2:2、YUV4:4:4.

RGB与YUV 的关系:

  • RGB用于屏幕图像的展示

  • YUV用于采集和编码

RGB转YUV:

Y = 0.299*R + 0.587*G + 0.114*B

U = -0.147*R - 0.289*G + 0.436*B = 0.492*(B-Y)

V = 0.615*R - 0.515*G - 0.100*B = 0.877*(R-Y)

YUV转RGB:

R = Y + 1.140*V

G = Y - 0.394*U - 0.581*V

B = Y + 2.032*U

YUV常见格式:

  • YUV4:4:4
  • YUV4:2:2
  • YUV4:2:0 (最常见 所有播放器都支持)

YUV4:2:0 :

4:2:0 并不意味着只有Y、Cb(蓝色分量)两个分量, 而没有Cr(红色分量)分量. 它实际指的是对每行扫描线来说,只有一种色度分量, 它以2:1的抽样率存储. 相邻的扫描行存储不同的色度分量, 也就是说, 如果一行是4:2:0的话, 下一行就是4:0:2, 再下一行是4:2:0...以此类推.

数据量的计算:

  • YUV = Y * 1.5

  • YUV = RGB / 2

YUV4:2:0存储:

  • YUV是分层存储的.
  • Y、U、V的对应关系 并不是按“行”来对应的.

YUV 存储格式:

     1、planar (平面)

           (YU12)I420 : YYYYYYYY UU VV  =>  YUV420P

           YV12 : YYYYYYYY VV UU =>  YUV420P

      2、packed (打包)

            NV12 : YYYYYYYY UVUV => YUV420SP

            NV21 : YYYYYYYY VUVU  => YUV420SP

未编码视频的YUV码流:

  • RGB码流 = 分辨率(宽*高)*3*帧率
  • YUV码流 = 分辨率(宽*高)*1.5*帧率 

   注: 一般说的网络带宽不是按字节计算的而是按位计算的, 所以这里的码流应该 再乘以8.

参考资料: 

en.wikipedia.org/wiki/YUV