分享
嘉宾
第十五期技术夜校分享嘉宾是——matrix
他有多年的互联网开发经验
开发过直播、短视频、IM等项目
在多媒体方向有丰富的实战经验
前言
我们播放的视频文件一般都是用一种封装格式封装起来的,封装格式的作用是什么呢?一般视频文件里不光有视频,还有音频,封装格式的作用就是把视频和音频打包起来。所以我们先要解封装格式,看有哪些视频流和哪些音频流,此时的音频流和视频流都还是压缩数据,不能直接用于显示的,这就需要解码。下面是播放一个视频文件时的流程图,其中视频文件如MP4、AVI等等我们可以把他理解为一个容器。

视频封装格式
封装格式(也叫容器),就是将已经编码压缩好的视频轨和音频轨按照一定的格式放到一个文件中,也就是说仅仅是一个外壳,或者大家把它当成一个放视频轨和音频轨的文件夹也可以。说得通俗点,视频轨相当于饭,而音频轨相当于菜,封装格式就是一个碗,或者一个锅,用来盛放饭菜的容器。下面是几种常用的 视频文件后缀类型 与其相对应的 封装格式。

AVI格式
AVI的英文全称为Audio Video Interleaved(后缀为.AVI),即音频视频交错格式。它于1992年被Microsoft公司推出。
这种视频格式的优点是图像质量好。由于无损AVI可以保存alpha通道,经常被我们使用。缺点太多,体积过于庞大,而且更加糟糕的是压缩标准不统一,最普遍的现象就是高版本Windows媒体播放器播放不了采用早期编码编辑的AVI格式视频。
QuickTime File Format格式
美国Apple公司开发的一种视频格式(后缀为.MOV),默认的播放器是苹果的QuickTime。
具有较高的压缩比率和较完美的视频清晰度等特点,并可以保存alpha通道。大家可能注意到了,每次安装EDIUS,我们都要安装苹果公司推出的QuickTime。安装其目的就是为了支持JPG格式图像和MOV视频格式导入。
MPEG格式
MPEG的英文全称为Moving Picture Experts Group(文件后缀可以是 .MPG .MPEG .MPE .DAT .VOB .ASF .3GP .MP4等),即运动图像专家组格式,该专家组建于1988年,专门负责为CD建立视频和音频标准,而成员都是为视频、音频及系统领域的技术专家。MPEG文件格式是运动图像压缩算法的国际标准。
WMV格式
WMV的英文全称为Windows Media Video(后缀为.WMV .ASF):,也是微软推出的一种采用独立编码方式并且可以直接在网上实时观看视频节目的文件压缩格式。WMV格式的主要优点包括:本地或网络回放,丰富的流间关系以及扩展性等。WMV格式需要在网站上播放,需要安装Windows Media Player(简称WMP),很不方便,现在已经几乎没有网站采用了。
Real Video格式
Real Networks公司所制定的音频视频压缩规范称为Real Media(后缀为.RM .RMVB)。用户可以使用RealPlayer根据不同的网络传输速率制定出不同的压缩比率,从而实现在低速率的网络上进行影像数据实时传送和播放。RMVB格式:这是一种由RM视频格式升级延伸出的新视频格式,当然性能上有很大的提升。RMVB视频也是有着较明显的优势,一部大小为700MB左右的DVD影片,如果将其转录成同样品质的RMVB格式,其个头最多也就400MB左右。大家可能注意到了,以前在网络上下载电影和视频的时候,经常接触到RMVB格式,但是随着时代的发展这种格式被越来越多的更优秀的格式替代,著名的人人影视字幕组在2013年已经宣布不再压制RMVB格式视频。
Flash Video格式
由Adobe Flash延伸出来的的一种流行网络视频封装格式(后缀为.FLV)。随着视频网站的丰富,这个格式已经非常普及。
Matroska格式
是一种新的多媒体封装格式(后缀为.MKV),这个封装格式可把多种不同编码的视频及16条或以上不同格式的音频和语言不同的字幕封装到一个Matroska Media档内。它也是其中一种开放源代码的多媒体封装格式。Matroska同时还可以提供非常好的交互功能,而且比MPEG的方便、强大。
视频编码
视频编码的作用:将视频像素数据(RGB,YUV 等)压缩成视频码流,从而压缩视频的体积。

H264
H264概述
H264视频压缩算法现在无疑是所有视频压缩技术中使用最广泛,最流行的。随着 x264/openh264以及ffmpeg等开源库的推出,大多数使用者无需再对H264的细节做过多的研究,这大降低了人们使用H264的成本。
H264压缩技术主要采用了以下几种方法对视频数据进行压缩。包括:
• 帧内预测压缩,解决的是空域数据冗余问题。
• 帧间预测压缩(运动估计与补偿),解决的是时域数据冗徐问题。
• 整数离散余弦变换(DCT),将空间上的相关性变为频域上无关的数据然后进行量化。
• CABAC压缩。
经过压缩后的帧分为:I帧,P帧和B帧:
• I帧:关键帧,采用帧内压缩技术。
• P帧:向前参考帧,在压缩时,只参考前面已经处理的帧。采用帧音压缩技术。
• B帧:双向参考帧,在压缩时,它即参考前而的帧,又参考它后面的帧。采用帧间压缩技术。
除了I/P/B帧外,还有图像序列GOP。GOP:两个I帧之间是一个图像序列,在一个图像序列中只有一个I帧。如下图所示:

H264的基本原理其实非常简单,下我们就简单的描述一下H264压缩数据的过程。通过摄像头采集到的视频帧(按每秒 30 帧算),被送到 H264 编码器的缓冲区中。编码器先要为每一幅图片划分宏块。
H264压缩技术
帧内压缩
H264的基本原理其实非常简单,下我们就简单的描述一下H264压缩数据的过程。通过摄像头采集到的视频帧(按每秒 30 帧算),被送到 H264 编码器的缓冲区中。编码器先要为每一幅图片划分宏块。宏块的大小有最大是16*16,最小有4*4。

如下图就是一个8*8的宏块,使用宏块的目的是为了更高的压缩比。

对于宏块我们使用上边和左边的像素对整个宏块进行预测:

帧间压缩
对于视频数据主要有两类数据冗余,一类是时间上的数据冗余,另一类是空间上的数据冗余。其中时间上的数据冗余是最大的。下面我们就先来说说视频数据时间上的冗余问题。为什么说时间上的冗余是最大的呢?假设摄像头每秒抓取30帧,这30帧的数据大部分情况下都是相关联的。也有可能不止30帧的的数据,可能几十帧,上百帧的数据都是关联特别密切的。对于这些关联特别密切的帧,其实我们只需要保存一帧的数据,其它帧都可以通过这一帧再按某种规则预测出来,所以说视频数据在时间上的冗余是最多的。如下图,通过宏块扫描与宏块搜索可以发现这两个帧的关联度是非常高的。进而发现这一组帧的关联度都是非常高的。因此,上面这几帧就可以划分为一组。其算法是:在相邻几幅图像画面中,一般有差别的像素只有10%以内的点,亮度差值变化不超过2%,而色度差值的变化只有1%以内,我们认为这样的图可以分到一组。

H264编码器首先按顺序从缓冲区头部取出两帧视频数据,然后进行宏块扫描。当发现其中一幅图片中有物体时,就在另一幅图的邻近位置(搜索窗口中)进行搜索。如果此时在另一幅图中找到该物体,那么就可以计算出物体的运动矢量了。如上图只有前景发生了位移而背景没有变化,那么背景就无需再进行编码。
NAL网络抽象层

H264编码分层
NAL层:(Network Abstraction Layer,视频数据网络抽象层): 它的作用是H264只要在网络上传输,在传输的过程每个包以太网是1500字节,而H264的帧往往会大于1500字节,所以要进行拆包,将一个帧拆成多个包进行传输,所有的拆包或者组包都是通过NAL层去处理的。
VCL层:(Video Coding Layer,视频数据编码层):对视频原始数据进行压缩。
下面我们来重点讲一下NAL,对于视频流来说H264是一种码流 可以理解为类似与一种不见头,也不见尾的一条河流。如何从和流中取到自己想要的数据呢,在H264的标砖中有这样的一个封装格式叫做"Annex-B"的字节流格式。它是H264编码的主要字节流格式。几乎市面上的编码器是以这种格式进行输出的。起始码0x 00 00 00 01 或者 0x 00 00 01 作为分隔符。两个 0x 00 00 00 01之间的字节数据 是表示一个NAL Unit。
H264中有24个类型的NAL unit如下图所示:

我们结合一个例子看:

00 00 00 01 06 SEI单元,存放一些自定义信息如,坐标,作者等。
00 00 00 01 67 SPS即Sequence Paramater Set,又称作序列参数集。SPS中保存了一组编码视频序列(Coded
video sequence)的全局参数。所谓的编码视频序列即原始视频的一帧一帧的像素数据经过编码之后的结构组成的序列。主要参数如下(未全部列出)
(1) profile_idc
标识当前H.264码流的profile。
基准档次:baseline profile;
主要档次:main profile;
扩展档次:extended profile;
(2) level_idc
标识当前码流的Level。编码的Level定义了某种条件下的最大视频分辨率、最大视频帧率等参数,码流所遵从的level由level_idc指定。
(3) seq_parameter_set_id
表示当前的序列参数集的id。通过该id值,图像参数集pps可以引用其代表的sps中的参数。
00 00 00 01 68 PPS即Picture Paramater Set参数集合为图像参数集,里面的主要参数是宽和高。
对于点播视频来说SPS和PPS都会放在视频开头部分,而对于直播来讲视频流中会存在多个SPS和PPS,因为对于一些场景,如连麦,视频宽高会发生变化。这个时候就需要在PPS中标明,以便播放器更新。
结尾
为了让大家更好的理解H264原理,matrix以生动的音视频为例,将原本晦涩的原理变得浅显易懂。本次matrix带着大家初识了音视频及H264,下一次,他将带来更深入的分享,让我们一起期待吧~


【得物技术】
扫一扫关注公众号




