视频:
- 由一组图像组成
- 为了传输/占用更小的空间而被压缩
- 最终在显示设备上展示(未被压缩)
图像:
- 由像素组成
- 像素通过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.