常见的视频文件格式:
.mov
、.avi
、.mpg
、.vob
、.mkv
、.rm
、.rmvb
...
视频封装格式
视频封装格式是存储视频信息的容器。它里面包含了封装视频文件所需要的 视频信息、音频信息 和相关的 配置信息 (比如:视频和音频的关联信息、如何解码等等)。一种视频封装格式的直接反映就是对应着相应的视频文件格式。
下面看下 视频封装格式 对应的 视频文件格式 :
AVI(Audio Video Interleave) :.avi
优点:图像质量好,无损 AVI 可以保存 alpha 通道。
缺点:体积过于庞大,并且压缩标准不统一,存在较多的高低版本兼容问题。DV-AVI(Digital Video Format):.avi
一种家用数字视频格式。常见的数码摄像机就是使用这种格式记录视频数据的。它可以通过电脑的 IEEE 1394 端口传输视频数据到电脑,也可以将电脑中编辑好的的视频数据回录到数码摄像机中。WMV(Windows Media Video) : .wmv 、.asf
是微软推出的一种采用独立编码方式并且可以直接在网上实时观看视频节目的文件压缩格式。在同等视频质量下,WMV 格式的文件可以边下载边播放,因此很适合在网上播放和传输。MPEG(Moving Picture Experts Group) :.mpg、.mpeg、.mpe、.dat、.vob、.asf、.3gp、.mp4
MPEG 格式目前有三个压缩标准,分别是 MPEG-1、MPEG-2、和 MPEG-4。MPEG-4 是现在用的比较多的视频封装格式,它为了播放流式媒体的高质量视频而专门设计的,以求使用最少的数据获得最佳的图像质量。
Matroska:.mkv
Matroska 是一种新的视频封装格式,它可将多种不同编码的视频及 16 条以上不同格式的音频和不同语言的 字幕流 封装到一个 Matroska Media 文件当中。Real Video: .rm、.rmvb
用户可以使用 RealPlayer 根据不同的网络传输速率制定出不同的压缩比率,从而实现在低速率的网络上进行影像数据实时传送和播放。QuckTime File Format:.mov
这种封装格式具有较高的压缩比率和较完美的视频清晰度等特点,并可以保存 alpha 通道。Flash Video:.flv
这种格式被很多视频网站所
我们常用的视频封装格式有:AVI、MOV、WMV、mkv、flv、mp4
视频编解码
- 编码:就是按照一定的格式记录采样和量化后的数据。
编码包括软编码和硬编码:
软编码:使用CPU进行编码计算。
实现直接、简单,参数调整方便,升级易,但CPU负载重,性能较硬编码低,低码率下质量通常比硬编码要好一点。硬编码:使用非CPU编码,例如使用GPU芯片处理。
性能高,低码率下通常质量低于软编码器,但部分产品在GPU硬件平台移植了优秀的软编码算法(如X264)的,质量基本等同于软编码。视频编解码的过程是指对数字视频进行压缩和解压缩的一个过程。
常见视频编码方式:
-
H.261
、H.262
、H.263
-
H.264
:目前最常用,直播/小视频 中使用。
优点: 1、低码率 。 2、高质量的图像。 3、容错能力强。 4、网络适应性强。
压缩一个原始文件的大小为88GB
的文件:
MPEG-2
:压缩标准压缩后变成3.5GB
,压缩比为25∶1
。
H.264
:压缩标准压缩后变为879MB
,压缩比达到惊人的102∶1
。
H264最大的优势:具有很高的数据压缩比率,在同等图像质量下H264的压缩比是MPEG-2的2倍以上,MPEG-4的1.5~2倍。
H.265
:被称为高效率视频编码(High Efficiency Video Coding,简称 HEVC)是一种视频压缩标准,是 H.264 的继任者。HEVC 被认为不仅提升图像质量,同时也能达到 H.264 两倍的压缩率(等同于同样画面质量下比特率减少了 50%),可支持 4K 分辨率甚至到超高画质电视,最高分辨率可达到 8192×4320(8K 分辨率),这是目前发展的趋势。MPEG-1
、MPEG-2
、MPEG-4
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
。
注意:在做视频编解码时,需要考虑以下这些因素的平衡:视频的质量、用来表示视频所需要的数据量(通常称之为码率)、编解码算法的复杂度、针对数据丢失和错误的鲁棒性(Robustness)、编辑的方便性、随机访问、编码算法设计的完美性、端到端的延时以及其它一些因素。
下面我们来简单介绍一下H.264。
H.264
H.264
是现在广泛采用的一种编码方式。关于 H.264 相关的概念,从大到小排序依次是:序列、图像、片组、片(Slices
)、NAL Unit、宏块(macroblock
)、亚宏块、块、像素。
H.264
视频压缩后会成为一个序列帧,帧里包含若干图像,图像分为很多片,每个片可以分为很多宏块,每个宏块由许多子块组成。这就是H264结构图。
H.264
结构中,一个视频图像编码后的数据叫做一帧,一帧由一个片(slice
)或多个片组成,一个片由一系列的宏块(macroblock
)组成,一个宏块由16x16的YUV
数据组成。宏块(macroblock
)作为H.264
编码的基本单位。
H.264宏块划分
一个编码图像通常划分成若干宏块组成,一个宏块由一个16×16亮度像素和附加的一个8×8 Cb和一个8×8 Cr彩色像素块组成。
每个切片都包括 “切片头 + 切片数据” 。那每个切片数据包括了很多宏块。每个宏块包括了宏块的类型,宏块的预测,残差数据。
H.264 片(Slice
)
每个图象中,若干宏块被排列成片的形式。片分为I片、B片、P片和其他一些片。
I片只包含I宏块,P片可包含P和I宏块,而B片可包含B和I宏块。
- I宏块利用从 当前片 中已解码的像素作为参考进行 帧内预测。
- P宏块利用 前面 已编码图象作为参考图象进行 **帧内预测 **。
- B宏块则利用 双向 的参考图象(前一帧和后一帧)进行 帧内预测。
片的目的是为了限制误码的扩散和传输,使编码 片相互间是独立 的。
H.264 NAL Unit
NAL Unit:包含 NAL Unit header(占用8位,一个字节) 和 NAL Unit payload。
NAL Unit header:
第一位为 禁止位,可用于表示NAL单元损坏(有用,例如对于能够处理位错误的解码器)。
第二、三位表示相对重要性,以及图片是否存储在参考图片缓冲器中。
第四至八位 10种不同NAL单元类型的信号1NAL Unit payload(NAL单元有效载荷):字节的模拟被阻止序列。
注意:H264编码分为了2层:
NAL层:(Network Abstraction Layer 视频数据网络抽象层)
H.264在网络上传输过程中每个包以太网是1500字节,而H.264的帧往往会大于1500字节,所以就要进行拆包,将一个帧拆成多个包进行传输。所有的拆包或者组包都是通过NAL层去处理的。
VCL层:(Video Coding Layer 视频数据编码层) 对视频原始数据进行压缩.
NAL 单元是由一个NALU头部+一个切片。切片又可以细分成“切片头 + 切片数据”。我们之间了解过一个H.254的帧是由多个切片构成的,因为一帧数据一次有可能传不完。
H.264包含三种帧:
- I帧:关键帧,采用帧内压缩技术。
理解:摄像头对着你拍摄,1秒钟之内实际很少有大幅度的变化。摄像机一般一秒钟会抓取几十帧的数据。比如像动画就是25帧/s,一般视频文件都是在30帧/s左右。对于一些要求比较高,对动作的精细度有要求的,想要捕捉到完整的动作的,高级的摄像机一般是60帧/s。那些对于一组帧的变化很小。为了便于压缩数据,那怎么办?将第一帧完整的保存下来。如果没有这个关键帧后面解码数据,是完成不了的。所以I帧特别关键。
- P帧:向前参考帧。压缩时只参考前一个帧,属于帧间压缩技术。
理解:视频的第一帧会被作为关键帧完整保存下来,而后面的帧会向前依赖。也就是第二帧依赖于第一个帧。后面所有的帧只存储跟前一帧的差异。这样就能将数据大大的减少。从而达到一个高压缩率的效果。
- B帧:双向参考帧。压缩时即参考前一帧也参考后一帧,帧间压缩技术。
理解:压缩率高,存储的数据量小。B帧越多压缩率就越高。
实时互动的直播:B帧需要参考后面的帧后才能解码,这样在网络传输中就需要等待后面的帧传输过来。如果网络状态不好解码就会变慢。所以实时互动的直播一般不使用B帧。
泛娱乐的直播中:可以接受一定度的延时,需要比较高的压缩比就可以使用B帧。
场和帧:视频的一场或一帧可用来产生一个编码图像。在电视中,为减少大面积闪烁现象,把一帧分成两个隔行的场。
GOF(Group of Frame)一组帧:
GOF:一个 I帧 到下一个 I帧,这一组的数据,包括B帧、P帧。两个I帧之间是一个图像序列。
如果在一秒钟内有30帧,这30帧可以画成一组。如果摄像机或者镜头它一分钟之内它都没有发生大的变化,也可以把这一分钟内所有的帧划为一组。
SPS/PPS
- SPS(
Sequence Parameter Set
序列参数集):存放帧数、参考帧数目、解码图像尺寸、帧场编码模式选择标识等。 - PPS(
Picture Parameter Set
图像参数集):存放熵编码模式选择标识、片组数目、初始量化参数和去方块滤波系数调整标识等(与图像相关的信息)。
在一组帧之前我们首先收到的是SPS/PPS
数据。如果没有这组参数的话,我们是无法解码的。实际上就是存储GOP的参数。
SPS/PPS数据,我们将其归类到I帧。这2组数据是必需的。
视频花屏/卡顿原因
如果 GOF 分组中的 P帧或者I帧 丢失就会造成解码端的图像发生错误。 为了避免花屏问题的发生,一般如果发现 P帧或者I帧 丢失,就不显示本 GOF 内的所有帧,到下一个I帧来后重新刷新图像。 这时因为没有刷新屏幕,丢包的这一组帧全部扔掉了,图像就会卡在哪里不动。这就是卡顿的原因。
组内宏块查找
参考H264编码原理
帧内预测
参考H264编码原理
帧内压缩是针对于I帧的。因为它解决的是空间的数据冗余,而帧间压缩是解决的时间数据冗余。
H.264码流分层结构图:
- A Annex格式数据,就是起始码 + Nal Unit 数据。
- NAL Unit: NALU 头 + NALU数据。
- NALU 主体,是由切片组成。切片包括切片头 + 切片数据。
- Slice数据:宏块组成。
- PCM类:宏块类型 + pcm数据 或者 宏块类型 + 宏块模式 + 残差数据。
- Residual:残差块。