文件格式这个概念应该是咱们比较熟悉的,好比咱们常见的 Word 文档的文件格式是 .doc,JPG
图片的文件格式是 .jpg
等等。那对于视频来讲, 咱们常见的文件格式则有:.mov、.avi、.mpg、.vob、.mkv、.rm、.rmvb
等等。文件格式一般表现为文件在操做系统上存储时的后缀名,它一般会被操做系统用来与相应的打开程序关联,好比你双击一个 test.doc 文件,系统会调用 Word 去打开它。你双击一个 test.avi 或者 test.mkv 系统会调用视频播放器去打开它。git
一样是视频,**为何会有 .mov、.avi、.mpg 等等这么多种文件格式呢?**那是由于它们经过不一样的方式实现了视频这件事情,至于这个不一样在哪里,那就须要了解一下接下来要说的「视频封装格式」这个概念了。算法
视频封装格式,简称视频格式,至关于一种储存视频信息的容器,它里面包含了封装视频文件所须要的视频信息、音频信息和相关的配置信息(好比:视频和音频的关联信息、如何解码等等)。一种视频封装格式的直接反映就是对应着相应的视频文件格式。bash
下面咱们就列举一些文件封装格式:网络
AVI 格式,对应的文件格式为 .avi
,英文全称 Audio Video Interleaved,是由 Microsoft 公司于 1992 年推出。这种视频格式的优势是图像质量好,无损 AVI 能够保存 alpha 通道。缺点是体积过于庞大,而且压缩标准不统一,存在较多的高低版本兼容问题。ide
DV-AVI 格式,对应的文件格式为 .avi
,英文全称 Digital Video Format,是由索尼、松下、JVC 等多家厂商联合提出的一种家用数字视频格式。常见的数码摄像机就是使用这种格式记录视频数据的。它能够经过电脑的 IEEE 1394 端口传输视频数据到电脑,也能够将电脑中编辑好的的视频数据回录到数码摄像机中。性能
WMV 格式,对应的文件格式是 .wmv、.asf
,英文全称 Windows Media Video,是微软推出的一种采用独立编码方式而且能够直接在网上实时观看视频节目的文件压缩格式。在同等视频质量下,WMV 格式的文件能够边下载边播放,所以很适合在网上播放和传输。网站
MPEG 格式,对应的文件格式有 .mpg、.mpeg、.mpe、.dat、.vob、.asf、.3gp、.mp4
等等,英文全称 Moving Picture Experts Group,是由运动图像专家组制定的视频格式,该专家组于 1988 年组建,专门负责视频和音频标准制定,其成员都是视频、音频以及系统领域的技术专家。MPEG 格式目前有三个压缩标准,分别是 MPEG-一、MPEG-二、和 MPEG-4。MPEG-4 是如今用的比较多的视频封装格式,它为了播放流式媒体的高质量视频而专门设计的,以求使用最少的数据得到最佳的图像质量。ui
Matroska 格式,对应的文件格式是 .mkv
,Matroska 是一种新的视频封装格式,它可将多种不一样编码的视频及 16 条以上不一样格式的音频和不一样语言的字幕流封装到一个 Matroska Media 文件当中。编码
Real Video 格式,对应的文件格式是 .rm、.rmvb
,是 Real Networks 公司所制定的音频视频压缩规范称为 Real Media。用户可使用 RealPlayer 根据不一样的网络传输速率制定出不一样的压缩比率,从而实如今低速率的网络上进行影像数据实时传送和播放。spa
QuickTime File Format 格式,对应的文件格式是 .mov
,是 Apple 公司开发的一种视频格式,默认的播放器是苹果的 QuickTime。这种封装格式具备较高的压缩比率和较完美的视频清晰度等特色,并能够保存 alpha 通道。
Flash Video 格式,对应的文件格式是 .flv
,是由 Adobe Flash 延伸出来的一种网络视频封装格式。这种格式被不少视频网站所采用。
从上面的介绍中,咱们大概对视频文件格式以及对应的视频封装方式有了一个概念,接下来则须要了解一下关于视频更本质的东西,那就是视频编解码。
**封装格式:**就是将已经编码压缩好的视频数据 和音频数据按照必定的格式放到一个文件中.这个文件能够称为容器. 固然能够理解为这只是一个外壳.
一般咱们不只仅只存放音频数据和视频数据,还会存放 一下视频同步的元数据.例如字幕.这多种数据会不一样的程序来处理,可是它们在传输和存储的时候,这多种数据都是被绑定在一块儿的.
AVI
: 是当时为对抗quicktime格式(mov)而推出的,只能支持固定CBR恒定定比特率编码的声音文件MOV
:是Quicktime封装WMV
:微软推出的,做为市场竞争mkv
:万能封装器,有良好的兼容和跨平台性、纠错性,可带外挂字幕flv
: 这种封装方式能够很好的保护原始地址,不容易被下载到,目前一些视频分享网站都采用这种封装方式MP4
:主要应用于mpeg4的封装,主要在手机上使用。视频编解码的过程是指对数字视频进行压缩或解压缩的一个过程.
在作视频编解码时,须要考虑如下这些因素的平衡:视频的质量、用来表示视频所须要的数据量(一般称之为码率)、编码算法和解码算法的复杂度、针对数据丢失和错误的鲁棒性(Robustness)、编辑的方便性、随机访问、编码算法设计的完美性、端到端的延时以及其它一些因素。
H.26X 系列,由国际电传视讯联盟远程通讯标准化组织(ITU-T)主导,包括 H.26一、H.26二、H.26三、H.26四、H.265
MPEG 系列,由国际标准组织机构(ISO)下属的运动图象专家组(MPEG)开发。
VCD
上,有些在线视频也使用这种格式。该编解码器的质量大体上和原有的 VHS 录像带至关。H.262
,使用在 DVD
、SVCD
和大多数数字视频广播系统和有线分布系统中。MPEG-2
第二部分和初版的 H.263
,它的压缩性能有所提升。H.264
,是这两个编码组织合做诞生的标准。其余,AMV、AVS、Bink、CineForm
等等,这里就不作多的介绍了。
介绍了上面这些「视频编解码方式」后,咱们来讲说它和上一节讲的「视频封装格式」的关系。
能够把「视频封装格式」看作是一个装着视频、音频、「视频编解码方式」等信息的容器。一种「视频封装格式」能够支持多种「视频编解码方式」,好比:QuickTime File Format(.MOV) 支持几乎全部的「视频编解码方式」,MPEG(.MP4) 也支持至关广的「视频编解码方式」。当咱们看到一个视频文件名为 test.mov 时,咱们能够知道它的「视频文件格式」是 .mov,也能够知道它的视频封装格式是 QuickTime File Format,
可是没法知道它的「视频编解码方式」。那比较专业的说法多是以 A/B 这种方式,A 是「视频编解码方式」,B 是「视频封装格式」。好比:一个 H.264/MOV 的视频文件,它的封装方式就是 QuickTime File Format,编码方式是 H.264
视频中除了画面一般还有声音,因此这就涉及到音频编解码。在视频中常用的音频编码方式有
视频编码格式
音频编码格式:
AAC是目前比较热门的有损压缩编码技术,而且衍生了LC-AAC,HE-AAC,HE-AAC v2 三种主要编码格式.
优点:在小于128Kbit/s的码率下表现优异,而且多用于视频中的音频编码
适合场景:于128Kbit/s如下的音频编码,多用于视频中的音频轨的编码
H.264 是如今普遍采用的一种编码方式。关于 H.264 相关的概念,从大到小排序依次是:序列、图像、片组、片、NALU、宏块、亚宏块、块、像素。
图像
H.264 中,「图像」是个集合的概念,帧、顶场、底场均可以称为图像。一帧一般就是一幅完整的图像。
当采集视频信号时,若是采用逐行扫描,则每次扫描获得的信号就是一副图像,也就是一帧。
当采集视频信号时,若是采用隔行扫描(奇、偶数行),则扫描下来的一帧图像就被分为了两个部分,这每一部分就称为「场」,根据次序分为:「顶场」和「底场」。
「帧」和「场」的概念又带来了不一样的编码方式:帧编码、场编码逐行扫描适合于运动图像,因此对于运动图像采用帧编码更好;隔行扫描适合于非运动图像,因此对于非运动图像采用场编码更好。
片(Slice),每一帧图像能够分为多个片
网络提取层单元(NALU, Network Abstraction Layer Unit),
NALU 是用来将编码的数据进行打包的,一个分片(Slice)能够编码到一个 NALU 单元。不过一个 NALU 单元中除了容纳分片(Slice)编码的码流外,还能够容纳其余数据,好比序列参数集 SPS。对于客户端其主要任务则是接收数据包,从数据包中解析出 NALU 单元,而后进行解码播放。
宏块(Macroblock),分片是由宏块组成。
咱们开发场景中使用最多的应该是 RGB 模型
在 RGB 模型中每种颜色须要 3 个数字,分别表示 R、G、B,好比 (255, 0, 0) 表示红色,一般一个数字占用 1 字节,那么表示一种颜色须要 24 bits。那么有没有更高效的颜色模型可以用更少的 bit 来表示颜色呢?
如今咱们假设咱们定义一个**「亮度(Luminance)」**的概念来表示颜色的亮度,那它就能够用含 R、G、B 的表达式表示为:
Y = kr*R + kg*G + kb*B
复制代码
Y 即「亮度」,kr、kg、kb 即 R、G、B 的权重值。
这时,咱们能够定义一个**「色度(Chrominance)」**的概念来表示颜色的差别:
Cr = R – Y
Cg = G – Y
Cb = B – Y
复制代码
Cr、Cg、Cb 分别表示在 R、G、B 上的色度份量。上述模型就是 YCbCr 颜色模型基本原理。
YCbCr 是属于 YUV 家族的一员,是在计算机系统中应用最为普遍的颜色模型,就好比在本文所讲的视频领域。在 YUV 中 Y 表示的是「亮度」,也就是灰阶值,U 和 V 则是表示「色度」。
YUV 的关键是在于它的亮度信号 Y 和色度信号 U、V 是分离的。那就是说即便只有 Y 信号份量而没有 U、V 份量,咱们仍然能够表示出图像,只不过图像是黑白灰度图像。在YCbCr 中 Y 是指亮度份量,Cb 指蓝色色度份量,而 Cr 指红色色度份量。
如今咱们从 ITU-R BT.601-7 标准中拿到推荐的相关系数,就能够获得 YCbCr 与 RGB 相互转换的公式
Y = 0.299R + 0.587G + 0.114B
Cb = 0.564(B - Y)
Cr = 0.713(R - Y)
R = Y + 1.402Cr
G = Y - 0.344Cb - 0.714Cr
B = Y + 1.772Cb
复制代码
这样对于 YCbCr 这个颜色模型咱们就有个初步认识了,可是咱们会发现,这里 YCbCr 也仍然用了 3 个数字来表示颜色啊,有节省 bit 吗?为了回答这个问题,咱们来结合视频中的图像和图像中的像素表示来讲明
假设图片有以下像素组成
一副图片就是一个像素阵列.每一个像素的 3 个份量的信息是完整的,YCbCr 4:4:4。
下图中,对于每一个像素点都保留「亮度」值,可是省略每行中偶素位像素点的「色度」值,从而节省了 bit。YCbCr4:2:2