一、I帧、P帧、B帧差别
I帧表示关键帧,完整画面图片压缩;包含完整画面信息,解码时只需要本帧数据就可以完成。
P帧表示这一帧跟之前的一个关键帧(或P帧)的差别。解码时需要用之前缓存的画面叠加上本帧定义的差别,生成最终画面。(也就是差别帧,P帧没有完整画面数据,只有与前一帧的画面差别的数据)
B帧是双向差别帧。B帧记录的是本帧与前后帧的差别(具体比较复杂,有4种情况)。换言之,要解码B帧,不仅要取得之前的缓存画面,还要解码之后的画面,通过前后画面的与本帧数据的叠加取得最终的画面。
为提高压缩效率,I帧一般为有损压缩,P帧、B帧为无损压缩(只是差异信息,数据较少)。三者的压缩比一般是7,20,50。
二、视频编码格式标准
所谓编码格式就指的一种压缩视频图像的算法标准。主流的视频编码格式一览表如下:
格式 | 推出机构 | 推出时间 | 发展状况 |
---|---|---|---|
HEVC(H265) | MPEG/ITU-T | 2013 | 不普及 |
H264(AVC) | MPEG/ITU-T | 2003 | 各个领域 |
MPEG4 | MPEG | 2003 | 不温不火 |
MPEG2 | MPEG | 2001 | 数字电视 |
VP9 | 2013 | 不普及 | |
VP8 | 2008 | 不普及 | |
VC-1 | Microsoft Inc. | 2006 | 微软平台 |
其实这里H264已经成为事实的视频领域的行业编码标准。目前主流的视频都采用H264格式进行视频编码,H265可能对目前的计算机硬件资源来说计算量还是过大,还没有普及(只是猜测)。MPEG4、MPEG2和H264都师出同门,只不过H264在图像质量和压缩率上更胜一筹,其他几种编码格式基本跟H264差不多,只是出自不同公司或者组织,并且没有H264普及。
同样音频编码和视频编码一样,指的是通过一定的手段将音频数据进行压缩。音频数据在视频文件中占用空间跟视频数据比非常的小,我们这里就不重讨论,目前主要的音频编码格式有AAC、AC-3、MP3、WMA。其中AAC应该是视频文件中最主流的编码格式。
三、视频的封装格式
封装格式的主要作用是把视频码流和音频码流按照一定的格式存储在一个文件中。现如今流行的封装格式如下表所示:
格式 | 推出机构 | 流媒体 | 支持的视频编码 | 支持音频编码格式 | 应用领域 |
---|---|---|---|---|---|
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之外,几乎所有的封装格式都支持流媒体播放,也就是“边下边播放”。
为什么要分封装格式和视频编码格式呢? 这个其实跟网络分七层模型一个原理。解耦和,降低依赖,底层给上层提供基础功能,底层和上层都都可以单独扩展,可以以多种方案组合编码与封装,比如MP4与H264、MP4与MPEG、TS与H264等等。比如这里面的这边文章的编码就只负责将最原始的音频和视频数据就行压缩,而压缩完的数据要怎么组织就拜托给上层的封装,封装接到视频音频数据负责给数据编号,指定同步协议,加入字幕等操作。经过封装后,得到的就是可以播放的上面提到的视频文件MP4或者MKV等等。把这个过程反过来就是上图描述的视频播放的过程。
四、视频播放原理
比如我们在网站上看一个视频的时候,需要经过这几个步骤:解协议,解封装,解码视音频,视音频同步。如果播放本地文件则不需要解协议,为以下几个步骤:解封装,解码视音频,视音频同步。他们的过程如图所示。
Paste_Image.png
从解协议的结果封装格式数据开始讨论。
解封装的作用,就是将输入的封装格式的数据,分离成为音频流压缩编码数据和视频流压缩编码数据。封装格式种类很多,例如MP4,MKV,RMVB,TS,FLV,AVI等等,它的作用就是将已经压缩编码的视频数据和音频数据按照一定的格式放到一起。例如,FLV格式的数据,经过解封装操作后,输出H.264编码的视频码流和AAC编码的音频码流。
解码的作用,就是将视频/音频压缩编码数据,解码成为非压缩的视频/音频原始数据。音频的压缩编码标准包含AAC,MP3,AC-3等等,视频的压缩编码标准则包含H.264,MPEG2,VC-1等等。解码是整个系统中最重要也是最复杂的一个环节。通过解码,压缩编码的视频数据输出成为非压缩的颜色数据,例如YUV420P,RGB等等;压缩编码的音频数据输出成为非压缩的音频抽样数据,例如PCM数据。
视音频同步的作用,就是根据解封装模块处理过程中获取到的参数信息,同步解码出来的视频和音频数据,并将视频音频数据送至系统的显卡和声卡播放出来。
参考:http://www.jianshu.com/p/c905f3ec59c9