视频是什么?
不知道大家小时候是否玩过一种动画小人书,连续翻动的时候,小人书的画面就会变成一个动画,类似现在的gif,由于人类眼睛的特殊结构,画面快速切换时,画面会有残留,感觉起来就是连贯的动作。所以,视频就是由一系列图片构成的!
像素、分辨率、位深、帧率、码率是什么?
- 像素
大家可能都对像素很熟悉了,平时手机屏幕参数都是多少多少像素。像素是图像的基本单元,一个个像素就组成了图像。像素可以理解为就是图像中的一个点 - 分辨率
如何表示一张图像有多少像素,分辨率的概念就产生了。比如分辨率 1920x1080 的图像,1920 指的是该图像的宽度方向上有 1920 个像素点,1080 指的是图像的高度方向上有 1080 个像素点。通常我们认为分辨率越高图像越清晰,其实这不是很严谨,对于原始图像来说,确实分辨率越高图像越清晰。但通过放大图像来使得其分辨率增高,图像反而越模糊,因为图像放大过程中是通过插值的方式填补像素的 - 位深
8位位深,2^8,可以显示1600万多种颜色
现在有的显示器为10位位深,即2^10,约可以显示10亿种颜色 - 帧率
帧,是视频的一个基本概念,表示一张画面,如上面的翻页动画书中的一页,就是一帧。一个视频就是由许许多多帧组成的。
帧率,即单位时间内帧的数量,单位为:帧/秒 或fps
24/25 fps:1秒 24/25 帧,一般的电影帧率。
30/60 fps:1秒 30/60 帧,游戏的帧率,30帧可以接受,60帧会感觉更加流畅逼真。
85 fps以上人眼基本无法察觉出来了,所以更高的帧率在视频里没有太大意义。 - 码率
码率,是指一个数据流中每秒钟的数据量(可以是视频、音频等数据流)
颜色编码 RGB、YUV是什么?颜色空间YCrCb是什么?RGB\YUV相互如何转换?
-
RGB很好理解,一种颜色编码格式
3基色可以调配出任意颜色,是目前最常用的颜色编码格式。目前大部分显示器用的都是RGB,平时开发过程中颜色表达也用的是RGB -
YUV也是一种颜色编码格式
1.YUV是指亮度和色度分开表示的颜色编码格式,“Y”表示明亮度,也就是灰度值。而“U”和“V”表示的是色度,作用是描述影像色彩及饱和度,用于指定像素的颜色。
没有UV信息一样可以显示完整的图像,只不过是黑白的,这样的设计很好地解决了彩色、黑白图像的兼容问题。
2.YUV不像RGB那样要求三个独立的视频信号同时传输,所以用YUV方式传送占用极少的带宽。
3.YUV在对照片或影片编码时,考虑到人类的感知能力,对亮度更敏感,对色度不那么敏感,可以多压缩UV数据少压缩Y数据而不被人眼感知,基于此允许降低色度的带宽。也就是编码的时候允许Y的量比UV要多,允许对图片的UV分量进行下采样(又称为降采样,可以通俗地理解为缩小图像,减少矩阵的采样点数),这样数据占用的空间就比RGB更小,比如移动端Camera拍照捕获的图像数据、直播推流的流数据都是用这种颜色编码格式,以此降低数据传输压力 -
上采样、下采样
下采样又称为降采样,可以通俗地理解为缩小图像,减少矩阵的采样点数。
上采样又称为插值,可以通俗地理解为放大图像,增加矩阵的采样点数 -
与颜色编码YUV息息相关的是颜色空间YCrCb
Y”表示明亮度(Luminance、Luma),是RGB各个分量的加权之和,“Cr”和“Cb”则是色度、浓度(Chrominance、Chroma),“Cb”表示蓝色值跟亮度的差距,“Cr”表示红色值跟亮度的差距。
颜色编码YUV和颜色空间YCrCb常常混为一谈,所以‘U’可以看作‘Cr’,‘V’可以看作‘Cb’ -
YUV采样 (3种主流采样方式)
YUV采样示意图
YUV的优点之一是,感知质量不会显著下降的前提下,色度通道的采样率与Y通道的采样率相比更低。一般用一个叫做A:B:C(即y:u:v)的符号用来描述U和V相对于Y的采样频率
YUV 4:4:4采样,每一个Y对应一组UV分量,全采样
YUV 4:2:2采样,每两个Y共用一组UV分量,2:1水平下采样,没有垂直下采样
YUV 4:2:0采样,每四个Y共用一组UV分量,2:1水平下采样,2:1垂直下采样
注意,4:2:0并不代表y:u:v = 4:2:0,这里指的是在每一行扫描时,只扫描一种色度分量(U 或者 V),和 Y 分量按照 2 : 1 的方式采样。比如,第一行扫描时,YU 按照 2 : 1 的方式采样,那么第二行扫描时,YV 分量按照 2:1 的方式采样。所以y和u或者v的比都是2:1
采样方式很重要,只有正确地还原了每个像素点的YUV值,才能通过YUV与RGB的转换公式提取出每个像素点的RGB值,然后显示出来
为了方便理解,使用下图来描述,以黑点表示采样该像素点的Y分量,以空心圆圈表示采用该像素点的UV分量
-
YUV的存储格式
YUV存储格式有两大类:packed
和planar
1.packed
:Y、U、V 存储在一个数组中,每个像素点的Y、U、V是连续交错存储的
2.planar
:Y、U、V 存储为三个独立的数组中 -
YUV的存储格式
YUV420P
1. YUV420P(planar、YUV420)先后存储所有的Y、U、V分量
正是因为 YUV420 是2:1水平下采样,2:1垂直下采样,所以y分量数量等于视频 宽乘以高,u和v分量数量都是视频 宽乘以高/4
2. YUV420SP (planar、YUV420),先存储所有的 Y 分量后,按照 UV 或者 VU 的交替顺序进行存储了
YUV420SP
3. YUY2(packed、YUV422)
数据可视为unsigned char数组。第一个字节包含第一个Y样本,第二个字节包含第一U (Cb)样本,第三字节包含第二Y样本,第四个字节包含第V (Cr)样本,以此类推
YUY2
4. UYVY(packed、YUV422)
和YUY2和类似,只是存储方向是相反的
UYVY
YUV420采样还有 YV12、YU12、NV12 、NV21 等存储格式,不常用就不做详细介绍了
同样YUV422采样也还有其他存储格式,不常用就不做详细介绍了 -
RGB\YUV如何相互转换
为什么要转换?一般解码后的视频格式为yuv,但是一般显卡渲染的格式是RGB,所以需要把yuv转化为RGB
Color Range 分为两种,一种是 Full Range,一种是 Limited Range。Full Range 的 R、G、B 取值范围都是 0~255。而 Limited Range 的 R、G、B 取值范围是 16~235。
而对于每种Color Range来说,还有不同的转换标准,常见的标准主要是 BT601 和 BT709(BT601 是标清的标准,而 BT709 是高清的标准)
公式如下
1.BT601 limited range
YUV2RGB
R = Y - 16 + 1.372 * (V - 128)
G = Y - 16 - 0.337 * (U - 128) - 0.699 * (V - 128)
B = Y - 16 + 1.734 * (U - 128)
RGB2YUV
Y = 0.299 * R + 0.587 * G + 0.114 * B + 16
U = -0.173 * R - 0.339 * G + 0.511 * B + 128
V = 0.511 * B - 0.428 * G - 0.083 * B + 128
2.BT601 full range
YUV2RGB
R = 1.164 * (Y - 16) + 1.596 * (V - 128)
G = 1.164 * (Y - 16) - 0.392 * (U - 128) - 0.812 * (V - 128)
B = 1.164 * (Y - 16) + 2.016 * (U - 128)
RGB2YUV
Y = 0.257 * R + 0.504 * G + 0.098 * B + 16
U = -0.148 * R - 0.291 * G + 0.439 * B + 128
V = 0.439 * R - 0.368 * G - 0.072 * B + 128
3.BT709 full range
YUV2RGB
R = 1.1644 * (Y - 16) + 1.7928 * (V - 128)
G = 1.1644 * (Y - 16) - 0.2133 * (U - 128) - 0.533 * (V - 128)
B = 1.1644 * (Y - 16) + 2.1124 * (U - 128)
RGB2YUV
Y = 0.1826 * R + 0.6142 * G + 0.0620 * B + 16
U = -0.1006 * R - 0.3386 * G + 0.4392 * B + 128
V = 0.4392 * B - 0.3989 * G - 0.0403 * B + 128
4.BT709 limit range
YUV2RGB
R = Y + 1.5748 * (V - 128)
G = Y - 0.1881 * (U - 128) - 0.4681 * (V - 128)
B = Y + 1.8556 * (U - 128)
RGB2YUV
Y = 0.2126 * R + 0.7152 * G + 0.0722 * B
U = -0.1146 * R - 0.3854 * G + 0.500 * B + 128
V = 0.500 * B - 0.4542 * G - 0.0468 * B + 128 - 示例 原图、YUV分量图
什么是音视频编码?为什么音视频要编码?H264、AAC是什么?
在计算机的世界中,一切都是0和1组成的,音频和视频数据也不例外。由于音视频的数据量庞大,如果按照裸流数据存储的话,那将需要耗费非常大的存储空间,也不利于传送。而音视频中,其实包含了大量0和1的重复数据,因此可以通过一定的算法来压缩这些0和1的数据,这个压缩过程就是编码!因此,编码可以大大减小音视频数据的大小,让音视频更容易存储和传送。
那么假设一个视频,分辨率是 1080P、帧率25fps、时长 2 小时,yuv420的格式的话一个像素为1.5字节,这个视频的大小是 1920 x 1080 x 1.5 x 25 x 3600 x 2 = 521.4G,太大了怎么保存?传输的话那岂不是更难!这就是为什么要编码!
H264是视频编码格式,还有H265......
AAC是音频编码格式
什么是音视频封装格式?MKV、MP4是什么?
音视频的时长怎么获取,音视频的封面怎么获取,音视频的格式怎么获取呢?这些信息都以特定格式存储在文件开头或者结尾,称为多媒体信息或者多媒体元数据。通用的封装格式由:文件标识头+多媒体信息+音视频(字幕)轨+视频帧索引块组成,如果是纯音频,后面可能还有歌词。音视频的封装格式就是通过解析文件标识头进行判断的,然后解析多媒体信息从而获取时长,再解析视频帧索引块,最后根据索引块去获取对应时间戳的视频帧
MKV、MP4就是常用的视频封装格式
网友评论