参考:
https://www.jianshu.com/p/c905f3ec59c9
你所能看到的视频
现在可能大部分人都直接用浏览器在视频网站上看视频了,已经不太能看到视频的后缀名之类的东西了。但是如果是把视频下载到本地观看的话,是可以看到视频文件的后缀的。这也就是我们平时所说的视频格式。目前比较主流的视频格式有下面这几种:avi,rmvb,mp4,flv,mkv等等。这里面作为的视频格式实际上是指视频的封装格式指的是以什么方式把视频和音频数据打包成一个文件,所一个这个封装格式其实与视频和音频采用什么方式编码没有什么关系。总的来说,不同的封装格式之间差距不大,各有优劣。
注:有些封装格式支持的视音频编码标准十分广泛,应该算比较优秀的封装格式,比如MKV;而有些封装格式支持的视音频编码标准很少,应该属于落后的封装格式,比如RMVB。
封装格式
封装格式的主要作用是把视频码流和音频码流按照一定的格式存储在一个文件中。现如今流行的封装格式如下表所示:
| 格式 | 推出机构 | 流媒体 |支持的视频编码|支持音频编码格式|应用领域|
|:----|:----|:----|:----|:----|
|AVI|Mirosoft Inc.|不支持|几乎所有|几乎所有|下载的视频文件(现在可能很少见到)|
|MP4|MPEG|支持|MPEG-2、MPEG-4、H.264|AAC,MPEG-1 Layers I, II, III、AC-3等|互联网视频|
|TS|MPEG|支持|MPEG-2、MPEG-4、H.264|AAC,MPEG-1 Layers I, II, III|互联网视频、IPTV、数字电视|
|FLV|Adobe Inc.|支持|Sorenson、VP6、H264|MP3,ADPCM,Linear PCM、AAC等|互联网视频
|MKV|CoreCodec Inc.|支持|几乎所有|几乎所有|互联网视频|
|RMVB|Real Networks Inc.|支持|RealVideo 8,9,10|AAC、Cook Codec、RealAudio Lossless|下载的视频文件|
除了AVI之外,几乎所有的封装格式都支持流媒体播放,也就是“边下边播放”。什么叫封装可能现在理解起来比较抽象,下面我会详细讲解什么是封装以及什么是编码,以及他们之间的关系。
视频编码格式
了解了视频的封装格式后,如果剥离视频的封装格式后,就可以看到真正的视频数据,这些视频数据会有不同的编码格式。什么是编码格式呢?
我们平时所看到的视频,理论上就是一帧帧的图片连续的播放,形成动画效果。那么完整的保存所有图片,一部电影可能就要上百G的空间。视频编码就是为了压缩这些图片,以节省空间。我先讲一下简单的理论,比如一秒钟的视频通常有24帧,这24张图画大部分区域可能都比较相近,那么我们是不是可以找到一种方法,只保存一张完整图片(我们称为关键帧),不保存其他图片,只保存和这个完整图片的不同(通过某种数学建模表达),这样就会节省很多空间,在播放的时候,通过和关键帧与每一帧的不同逆向恢复成一张完整的图片,这样就得到了24张完整的图片。(这里只是举例,实际应用中并不一定是每24帧图像被设定一个关键帧)。OK,那么所谓编码格式就指的一种压缩视频图像的算法。主流的视频编码格式一览表如下:
其实这里H264已经成为事实的视频领域的行业编码标准。目前主流的视频都采用H264格式进行视频编码,H265可能对目前的计算机硬件资源来说计算量还是过大,还没有普及(只是猜测)。MPEG4、MPEG2和H264都师出同门,只不过H264在图像质量和压缩率上更胜一筹,其他几种编码格式基本跟H264差不多,只是出自不同公司或者组织,并且没有H264普及。
音频编码
这里在稍微讲一下音频编码吧。同样音频编码和视频编码一样,指的是通过一定的手段将音频数据进行压缩。音频数据在视频文件中占用空间跟视频数据比非常的小,我们这里就不重讨论,目前主要的音频编码格式有AAC、AC-3、MP3、WMA。其中AAC应该是视频文件中最主流的编码格式。
视频播放原理
比如我们在网站上看一个视频的时候,需要经过这几个步骤:解协议,解封装,解码视音频,视音频同步。如果播放本地文件则不需要解协议,为以下几个步骤:解封装,解码视音频,视音频同步。他们的过程如图所示。
这张图表示的是从网络流媒体下载到播放的整个过程,流媒体的协议有很多种,比如HTTP,RTMP或者MMS等,这里我们先不展开讨论(以后抽时间专门写一篇流媒体协议的文章介绍)。我们从解协议的结果封装格式数据开始讨论。
解封装的作用,就是将输入的封装格式的数据,分离成为音频流压缩编码数据和视频流压缩编码数据。封装格式种类很多,例如MP4,MKV,RMVB,TS,FLV,AVI等等,它的作用就是将已经压缩编码的视频数据和音频数据按照一定的格式放到一起。例如,FLV格式的数据,经过解封装操作后,输出H.264编码的视频码流和AAC编码的音频码流。
解码的作用,就是将视频/音频压缩编码数据,解码成为非压缩的视频/音频原始数据。音频的压缩编码标准包含AAC,MP3,AC-3等等,视频的压缩编码标准则包含H.264,MPEG2,VC-1等等。解码是整个系统中最重要也是最复杂的一个环节。通过解码,压缩编码的视频数据输出成为非压缩的颜色数据,例如YUV420P,RGB等等;压缩编码的音频数据输出成为非压缩的音频抽样数据,例如PCM数据。
视音频同步的作用,就是根据解封装模块处理过程中获取到的参数信息,同步解码出来的视频和音频数据,并将视频音频数据送至系统的显卡和声卡播放出来。
为什么要分封装格式和视频编码格式呢? 这个其实跟网络分七层模型一个原理。解耦和,降低依赖,底层给上层提供基础功能,底层和上层都都可以单独扩展,可以以多种方案组合编码与封装,比如MP4与H264、MP4与MPEG、TS与H264等等。比如这里面的这边文章的编码就只负责将最原始的音频和视频数据就行压缩,而压缩完的数据要怎么组织就拜托给上层的封装,封装接到视频音频数据负责给数据编号,指定同步协议,加入字幕等操作。经过封装后,得到的就是可以播放的上面提到的视频文件MP4或者MKV等等。把这个过程反过来就是上图描述的视频播放的过程。