作者 | 翁鹏
42
什么是视频?
视频是利用人眼视觉暂留的原理,也就是一张张连续的图片,图片切换的非常快我们的眼睛跟不过来就感觉非常的流畅没有图片切换的卡顿。
图片
视频其实是一张张图片组成的,但是电脑怎么理解图片呢?如果将图片放大就可以看到一个个的小方块,那就是一个像素其中就包含了它的颜色信息。
常用的颜色编码就是 RGB
一个像素大小为 24bit
其中红绿蓝各占 8bit
,控制红绿蓝三种颜色的比例就可以表示 16777216
种颜色。除了 RGB
还有 ARGB 32
它包含了 alpha
通道信息也就是透明度,一个像素需要 32bit
大小。
![](https://i-blog.csdnimg.cn/blog_migrate/67951731dde2830a028652bbf1e3b8d5.png)
YUV
另一种常用的颜色编码是 YUV
也可以称为 YCbCr
,Y
代表亮度,U(Cb)
表示蓝色分量(蓝色通道与亮度的差值),v(Cr)
表示红色分量(红色通道与亮度的差值),电视就是使用 YUV
编码,为了兼容黑白电视,因为 YUV
其中的 Y
包含了整个图片的亮度信息它可以直接输出黑白图片。
![](https://i-blog.csdnimg.cn/blog_migrate/6eedf58018441793720ed496df1c2064.png)
YUV
也分为很多格式,如 YUV422
YUV420
等,其中最常用的是 YUV420
,它表示每采集 4
个 Y
就采集 1 个 U
和 v
,平均下来 1 个像素就占 12bit
是 rgb
的一半,它就是利用了人眼对亮度比较敏感对颜色比较麻木的特性减少体积,一般手机摄像头拍出来就是 YUV420
格式。
YV12
I420
YU12
NV12
NV21
都是 YUV420
。YV12
I420
也称为 YUV420P
(P 表示平面格式),它们的区别是 U
V
储存顺序不同。网络上的视频一般都是 YUV420P
。
I420: YYYYYYYY UU VV => YUV420P
YV12: YYYYYYYY VV UU => YUV420P
NV12: YYYYYYYY UVUV => YUV420SP
NV21: YYYYYYYY VUVU => YUV420SP
分辨率
大多数电脑屏幕的分辨率是 1920x1080
这代表横向有 1920 个像素乘以纵向有 1080 个像素。
1920x1080
称为 Full HD
,1280x720
称为 HD
,2560x1440
称为 2k
,这些是 16:9
电视的标准。
视频画质 1080p
是代表纵向有多少行像素,这里的 p
代表是逐行扫描。还有 1080i
这里的 i
是代表隔行扫描,一帧画面分为奇数行和偶数行,这是以前电视台为了提升清晰度想出的办法,让相同的带宽下清晰度更高。
k
其实代表横向大约有几个 1024
列像素。比如 1111x9876
可以称为 1k
(或1.1k
)或 9876p
。
![](https://i-blog.csdnimg.cn/blog_migrate/f79e3f63bca2916cb06033fc8363bcf5.png)
帧
1 秒钟切换的图片数量我们用 fps
表示,代表 1 秒钟切换多少张图片。一般来说 24fps 就满足人眼,电影一般都是 24 帧。但是玩游戏 30fps
都卡,为什么 24fps
的电影那么流畅而游戏却那么卡呢?
那是因为电影都是模糊帧它是在拍摄时一帧就包含了物体在这一帧时间内的动作,比如拿手机长曝光路上的汽车。而游戏是实时渲染出来的每一帧都和前后帧没有位移关系,而且不同帧之间的渲染时间可能也不相同。这也是为什么交互动画,游戏都要追求 60fps
。
29.97
这种奇怪的帧数。是因为以前美国从黑白电视到彩色电视时,因为多了彩色信号,电视频段塞不下去这些信息。所以就在帧率上做了手脚,并且这个规范沿用至今。现在很多设备还是使用当时的规范。
视频容器
mp4
大家都知道是视频格式,但其实它是一种封装格式也可以叫做容器,因为它是将 视频
音频
字幕
元信息
... 等信息封装起来的一种容器,其中的视频就是经过编码过的视频。
视频容器和视频编码是多对多的关系,一个视频格式可以使用多种视频编码,一个视频编码也可以放进多种视频容器。
![](https://i-blog.csdnimg.cn/blog_migrate/37b877b9f066567c8f890a61273e527c.png)
比如 mp4
可以使用 h.264
h.265
等编码,avi
可以使用 h.264
MPEG-2
等编码,TS/PS
可以使用 h.264
MPEG-2
MPEG4
等编码,大多数容器都支持 h.264
编码。
视频格式其实是一个容器,所以视频格式转换可以直接使用 MediaCoder
这类工具直接转换编码相同的格式,因为两种视频格式使用的是相同的编码所以转换速度非常快。
在 ffmpeg 中想保持输出的视频和输入的视频使用相同的编码时,可以使用 -c copy
参数,表示直接复制视频和音频编码。可以加速视频转换。
但是对于 WebM
这类 VP8
VP9
编码的视频转 mp4
这种 H.264
编码的视频,就只能使用转码工具慢慢转了。
视频编码
编码也有很多的格式,现在主流的分为 h.26x
和 vpx
两大派系,其中 h.26x
派的 h.264
(又称MPEG-4第10部分,高级视频编码) 最常用。
视频编码主要是为了压缩视频,一个 1080p60fps
的视频 1 个像素算 3 字节的话,那么 1 分钟的视频就需要 20G
的空间!h.264
的压缩比大约是 1:100
也就是上面的视频经过压缩就只有 200M
。
H.264
H.264
是现在做流行的视频编码,几乎所有设备都支持这种编码。它是由国际电信联盟通电信标准部 (ITU-T) 和国际标准化组织/国际电工委员会动态图像专家组 (ISO/IEC MPEG) 共同开发的一种视频压缩技术。
vpx
2010 年谷歌收购了 On2 和其下的所有视频压缩技术。vp8
是 On2
最先进的视频压缩技术,收购后谷歌就宣布 vp8
永久免费。主要为网络环境设计,它的压缩能力并不输 h.264
。WebM
时谷歌基于开源容器格式 Matroska
开发的容器格式,用以封装 VP8
编码的视频和 Vorbis
编码的音频。
vp9
是谷歌开发用来替换老的 vp8
编码,它常与 Vorbis
或 Opus
音频编码一起使用。
帧内压缩
对于 h.264
这类现代编码格式,视频压缩分为帧内压缩和帧间压缩,帧内压缩就是将每一张图片压缩成 jepg
这种有损图像。
帧间压缩
帧间压缩其实就是图片之间变化其实都太小了,我们只要保存关键帧和它们之间的运动的物体轨迹然后智能预测就好了,根本不需要记住中间完整的图像,两个关键帧之间的帧就称为预测帧。
h.264
中就有 I帧(关键帧)
P帧(前向预测帧)
和 B帧(双向预测帧)
的概念,前向预测帧就是这一帧需要知道前一帧的信息才能渲染出来,双向预测是在 I帧
和 P帧
的基础上再预测,就是要同时只要它前一帧和后一帧才能推出这一帧的图像信息。
GOP
GOP
是一组连续的画面它由一张I帧
和多张P帧
/B帧
组成(一个 I帧
过后要经过多少帧才能碰到下个 I帧
),它是编码器和解码器存取的基本单位,表示每一组 IPB帧
序列包含多少帧。
GOP
的值越大那么视频的模拟出来的 P/B
帧的数量也就更多,同码率下的 GOP
越大视频质量就越高。
![](https://i-blog.csdnimg.cn/blog_migrate/e3ec2782bac37a00686968e4551d60ee.png)
IDR 帧
IDR帧
是 I帧
的子集,解码器解码到 IDR帧
时,会立即将参考帧队列清空,并将已解码的数据全部输出或抛弃。重新查找参数集,开始一个新的序列。这样如果前一个序列出现重大错误,在这里可以获得重新同步的机会。IDR帧
图像之后的图像永远不会使用 IDR帧
之前的图像的数据来解码。
码率
码率(比特率)表示视频每秒的数据量,它使用比特每秒(bit/s
或bps
)为单位。码率决定了视频大小,也就间接决定视频质量。
![](https://i-blog.csdnimg.cn/blog_migrate/2b1370d9b6e6c132140a9f4a04597eef.png)
主要有三种控制码率的方法 CBR 固定码率
VBR 可变码率
和 CRF 固定质量
。
CBR
是全程使用固定码率,每秒的数据量是可以知道的,常用与直播,编码压力小。VBR
是动态码率,它会为简单的场景使用更小的码率,比如静止不动的画面,而复杂的场景使用更高的码率,它按需分配大大的减少了空间占用。CRF
是以画质为目标,不考虑码率和文件大小,它也会和VBR
一样最大化利用资源,但是最终的文件大小是不可以预期的。
什么是音频?
我们说话时,发出的声音震动空气,让空气产生变化形成一种波,就是声波。声音的频率一般会以赫兹表示,记为 Hz
,指每秒钟周期性震动的次数。1Hz
就是一秒震一次。人耳识别范围是 20Hz
到 20000Hz
,低于 20Hz
称为次声波,高于 20kHz
称为超声波。
![](https://i-blog.csdnimg.cn/blog_migrate/2e39059f0a297641e54601860d009e36.png)
和视频的帧率一样的道理,声音也有一个频率,叫做采样率,因为人耳识别最大频率是 20kHz
所以 22050
赫兹采样率很常用,一般用于无线电广播。8kHz
多用于电话,44100Hz
就是 CD 音质,96000 - 192000 Hz
就是蓝光 HD-DVD
的采样率。
除了采样频率还有采样大小,一般分为 8bit
和 16bit
,一般 16bit
用于双声道,8bit
用于单声道,当然也有反过来的 16bit
的单声道和 8bit
双声道。采样的大小决定了采样精度 8bit
只能将振幅划分成 256
个等级,16bit
是 65536
,32bit
是 4294967296
实在没这个必要。
声音也有码率,码率的大小等于 采样率 x 采样大小 x 通道
,通道就是单声道或双声道。
PCM
如何将声音模拟型号变为数字型号呢?这里就要用到 PCM 脉冲编码调制
, 首先将声音定期采样,采样完成后就对信息量化,最后会用 PCM 定义的格式将每一组量化值表示为一组二进制,这样电脑就可以理解了。PCM 中的声音数据是没有被压缩的,所以 PCM 编码也可以称为无损编码。wav
格式实际上就是把 PCM
包装了一下。
wav
是微软公司推出的一种音频储存格式,主要用于保存 Windows 平台下的音频源,无损格式除了 wav
格式还有 ape
和 flac
,它们本质是压缩了 wav
,播放时再还原成 wav
。
有损编码
有损编码主要是去掉音频中那些对人类听觉不重要的部分。
MP3
MP3 (MPEG-1 或 MPEG-2 Audio Layer III)
编码,它是在1991年,由位于德国埃尔朗根的研究组织弗劳恩霍夫协会的一组工程师发明和标准化,的它的压缩比是 1:10
或 1:12
,它的兼容性很好,有非常多的软件支持,但是它太老了,如今被使用的并不多了。
AAC
AAC (Advanced Audio Coding)
编码,出现于1997年,为一种基于 MPEG-2
的有损数字音频压缩的专利音频编码标准。
AAC编码的主要扩展名有三种
.aac
- 使用MPEG-2 Audio Transport Stream
容器,区别于使用MPEG-4
容器的MP4/M4A
格式,属于传统的AAC
编码。.mp4
- 使用了MPEG-4 Part 14
的简化版即3GPP Media Release 6 Basic
进行封装的AAC
编码.m4a
- 为了区别纯音频MP4
文件和包含视频的MP4
文件而由苹果使用的扩展名,Apple iTunes
对纯音频MP4
文件采用了.m4a
命名。M4A
的本质和音频MP4
相同,故音频MP4
文件亦可直接更改扩展名为M4A
。
AAC
现在很常用,兼容性也不错,一般和 h.264
一起使用。
Opus
Opus
编码,由 Xiph.Org
基金会开发,之后由互联网工程任务组进行标准化,目标是希望用单一格式包含声音和语音,目标是用于低延迟的网络环境,它适用于视频会议,电话语音等领域。压缩比是 1:18
而且它在高码率下比 AAC
音质更好,一般和 vp9
一起用。
Vorbis
Vorbis
b编码,由 Xiph.Org
基金会所领导并开放源代码的一个免费的开源软件项目,Vorbis
通常以 Ogg
作为容器格式,所以常合称为 Ogg Vorbis
,一般与 VP8
一起使用。当前 Xiph.Org
基金会建议使用延迟更低、音质更好的 Opus
编码来取代 Vorbis
。
![](https://i-blog.csdnimg.cn/blog_migrate/66180b39d08f38793649fdce578db5eb.png)
总结
视频一般由视频容器、编码过的视频和音频组成,一个视频文件中也可以包含字幕或多个音频。
视频中常用的颜色编码是 yuv420,它更节约空间。
视频最常使用的组合是
h.264
+aac
编码。视频中 I 帧最重要,但占用空间更多,B 帧只有通过前后帧的运算才能知道,占用空间更小。
全文完
以下文章您可能也会感兴趣:
我们正在招聘 Java 工程师,欢迎有兴趣的同学投递简历到 rd-hr@xingren.com 。