1.常见的视频文件格式
我们常见的文件格式则有:.mov、.avi、.mpg、.vob、.mkv、.rm、.rmvb
等等。为什么会有这么多种不同的文件格式?那是因为它们通过不同的方式实现了视频这件事情,至于这个不同在哪里,那就需要了解一下接下来要说的「视频封装格式」这个概念了。
2.视频封装格式
视频封装格式,简称视频格式,相当于一种存放视频信息的容器,它里面包含了视频信息、音频信息和相关的配置信息(例如:视频和音频的关联信息、如何解码等)。视频封装格式最直接的反映就是视频文件格式,如下表:
视频文件格式 | 视频封装格式 | 释义 |
---|---|---|
.avi | AVI(Audio Video Interleave) | 图像质量好,但体积过于庞大,压缩标准不统一,存在高低版本兼容问题。 |
.wmv | WMV(Windows Media Video) | 可边下载边播放,很适合网上播放和传输 |
.mpg .mpeg .mpe .dat .vob .asf .3gp .mp4 | MPEG(Moving Picture Experts Group) | 由运动图像专家组制定的视频格式,有三个压缩标准,分别是 MPEG-1、MPEG-2、和 MPEG-4,它为了播放流式媒体的高质量视频而专门设计的,以求使用最少的数据获得最佳的图像质量。 |
.mkv | Matroska | 一种新的视频封装格式,它可将多种不同编码的视频及 16 条以上不同格式的音频和不同语言的字幕流封装到一个 Matroska Media 文件当中。 |
.rm、.rmvb | Real Video | Real Networks 公司所制定的音频视频压缩规范称为 Real Media。用户可以使用 RealPlayer 根据不同的网络传输速率制定出不同的压缩比率,从而实现在低速率的网络上进行影像数据实时传送和播放。 |
.mov | QuickTime File Format | Apple 公司开发的一种视频格式,默认的播放器是苹果的 QuickTime。这种封装格式具有较高的压缩比率和较完美的视频清晰度等特点,并可以保存 alpha 通道。 |
.flv | Flash Video | 由 Adobe Flash 延伸出来的一种网络视频封装格式。这种格式被很多视频网站所采用。 |
3.容器
将已经编码压缩好的视频数据和音频数据按照一定的格式放到一个文件中,这个文件可以称为容器。当然可以理解为这只是一个外壳。
通常,除了音频数据和视频数据外,还会存放一些视频同步的元数据:例如字幕,这种多数据会给不同的程序来处理,但是在传输和存储的时候,又是被绑定在一起的。
4.视频编解码相关概念
4.1 视频编解码
视频编解码的过程-->对数字视频进行压缩或解压缩的过程。
4.2 常见的视频编解码方式
-
.H26x系列 由国际电传视讯联盟远程通信标准化组织(ITU-T)主导,包括 H.261、H.262、H.263、H.264、H.265。
.H261 用于老的视频会议或视频电话系统,之后的所有标准都基于它设计的。
.H262 等同于 MPEG-2 第二部分,使用在 DVD、SVCD 和大多数数字视频广播系统和有线分布系统中。
.H263 主要用于视频会议、视频电话和网络视频相关产品。比它之前的视频编码标准在性能上有了较大的提升。尤其是在低码率端,它可以在保证一定质量的前提下大大的节约码率。
.H264 等同于 MPEG-4 第十部分,也被称为高级视频编码(Advanced Video Coding,简称 AVC),是一种视频压缩标准,一种被广泛使用的高精度视频的录制、压缩和发布格式。该标准引入了一系列新的能够大大提高压缩性能的技术,并能够同时在高码率端和低码率端大大超越以前的诸标准。
.H265 高效率视频编码(High Efficiency Video Coding,简称 HEVC)是一种视频压缩标准,是 H.264 的继任者。HEVC 被认为不仅提升图像质量,同时也能达到 H.264 两倍的压缩率(等同于同样画面质量下比特率减少了 50%),可支持 4K 分辨率甚至到超高画质电视,最高分辨率可达到 8192×4320(8K 分辨率),这是目前发展的趋势。
-
MPEG系列 由国际标准组织机构(ISO)下属的运动图象专家组(MPEG)开发。
- MPEG-1 第二部分,主要使用在 VCD 上,有些在线视频也使用这种格式。该编解码器的质量大致上和原有的 VHS 录像带相当。
- MPEG-2 第二部分,等同于 H.262,使用在 DVD、SVCD 和大多数数字视频广播系统和有线分布系统中。
- MPEG-4 第二部分,可以使用在网络传输、广播和媒体存储上。比起 MPEG-2 第二部分和第一版的 H.263,它的压缩性能有所提高。
- MPEG-4 第十部分,等同于 H.264,是这两个编码组织合作诞生的标准。
「视频封装格式」= 视频 + 音频 +「视频编解码方式」 等信息的容器。
一种「视频封装格式」可以支持多种「视频编解码方式」。比如:QuickTime File Format(.MOV) 支持几乎所有的「视频编解码方式」,MPEG(.MP4) 也支持相当广的「视频编解码方式」。
5.音频编解码方式
经常使用的音频编码方式有
- AAC,英文全称 Advanced Audio Coding,是由 Fraunhofer IIS、杜比实验室、AT&T、Sony等公司共同开发,在 1997 年推出的基于 MPEG-2 的音频编码技术。2000 年,MPEG-4 标准出现后,AAC 重新集成了其特性,加入了 SBR 技术和 PS 技术,为了区别于传统的 MPEG-2 AAC 又称为 MPEG-4 AAC。
- MP3,英文全称 MPEG-1 or MPEG-2 Audio Layer III,是当曾经非常流行的一种数字音频编码和有损压缩格式,它被设计来大幅降低音频数据量。它是在 1991 年,由位于德国埃尔朗根的研究组织 Fraunhofer-Gesellschaft 的一组工程师发明和标准化的。MP3 的普及,曾对音乐产业造成极大的冲击与影响。
- WMA,英文全称 Windows Media Audio,由微软公司开发的一种数字音频压缩格式,本身包括有损和无损压缩格式。
5.1 直播/小视频中的编码格式
- 视频编码格式--> H264,低码率,高质量图像,容错能力强,网络适应强,具有很高的数据压缩比,能达到惊人的102:1
- 音频编码格式--> AAC,目前比较热门的有损压缩编码技术,在小于128Kbit/s的码率下表现优异,并且多用于视频中的音频编码。并且衍生了LC-AAC,HE-AAC,HE-AAC v2 三种主要编码格式.
- LC-AAC 是比较传统的AAC,主要应用于中高码率的场景编码(>= 80Kbit/s)
- HE-AAC 主要应用于低码率场景的编码(<= 48Kbit/s)
6.H264相关的一些概念
H264结构中,一个视频图像编码后的数据叫做一帧,一帧由一个片(slice)或多个片组成,一个片又由一个或多个宏块(MB)组成,一个宏块由多个子块组成,子块即16x16的yuv数据。 宏块是作为H264编码的基本单位。
- 场和帧:视频的一场或一帧可用来产生一个编码图像。
- 片:每个图象中,若干宏块被排列成片的形式。片分为I片、B片、P片和其他一些片。
- I片只包含I宏块,P片可包含P和I宏块,而B片可包含B和I宏块。
- I宏块利用从当前片中已解码的像素作为参考进行帧内预测。
- P宏块利用前面已编码图象作为参考图象进行帧内预测。
- B宏块则利用双向的参考图象(前一帧和后一帧)进行帧内预测。
- 片的目的是为了限制误码的扩散和传输,使编码片相互间是独立的。某片的预测不能以其它片中的宏块为参考图像,这样某一片中的预测误差才不会传播到其它片中去。
- I片只包含I宏块,P片可包含P和I宏块,而B片可包含B和I宏块。
- 宏块:一个编码图像通常划分成若干宏块组成,一个宏块由一个16×16亮度像素和附加的一个8×8 Cb和一个8×8 Cr彩色像素块组成。
6.1 颜色模型
通常我们采用RGB模型来表示颜色,RGB模型中,每种颜色需要3个数字分别表示R、G、B,每个数字占用1个bit字节,这样总共需要24bits,那么有没有更高效的颜色模型用更少的bit来表示颜色呢?-->YUV,Y表示亮度,也是灰阶值,U和V表示色度分量。
在YUV家族中,有一员YCbCr,
Y = kr * R + kg * G + kb * B
Cr = R – Y
Cg = G – Y
Cb = B – Y
Cr、Cg、Cb 分别表示在 R、G、B 上的色度分量。上述模型就是 YCbCr 颜色模型基本原理。
6.2 GOF
Group of Frame,一组帧。什么是一组帧-->就是一个I帧到下一个I帧,这一组的数据,包括B帧/P帧。也称作GOP,Group of Pictures。
6.3 SPS/PPS
SPS: (Sequence Parameter Set,序列参数集)存放帧数,参考帧数目,解码图像尺寸,帧场编码模式选择标识等.
- 一组帧的参数集.
PPS:(Picture Parameter Set,图像参数集).存放熵编码模式选择标识,片组数目,初始量化参数和去方块滤波系数调整标识等.(与图像相关的信息)
在一组帧之前我们首先收到的是SPS/PPS数据.如果没有这组参数的话,我们是无法解码.
SPS/PPS数据,我们也把其归类到I帧.这2组数据是绝对不能丢的.
7. H264编码相关概念
7.1 编码分层
H264编码分为2层:
-
NAL层(Network Abstraction Layer,视频数据网络抽象层)
- 它的作用是H264只要在网络上传输,在传输的过程每个包以太网是1500字节. 而H264的帧往往会大于1500字节的.所以就要进行拆包. 将一个帧拆成多个包进行传输.所有的拆包或者组包都是通过NAL层去处理的.
VCL层:(Video Coding Layer,视频数据编码层) 它的作用就是对视频原始数据进行压缩.
7.2 码流
有以下几种码流:
- SODB:(String of Data Bits,原始数据比特流),长度不一定是8的倍数.它是由VCL层产生的.因为非8的倍数所以处理比较麻烦.
- RBSP:(Raw Byte Sequence Payload,SODB+trailing bits),算法是在SODB最后一位补1.不按字节对齐补0. 如果补齐0,不知道在哪里结束.所以补1.如果不够8位则按位补0.
- EBSP:(Encapsulate Byte Sequence Payload),就是生成压缩流之后,我们还要在每个帧之前加一个起始位.起始位一般是十六进制的0001,即0x0001.
- 有个问题:在整个编码的数据里,可能存在两个0x00的冲突情况,即前一段数据编码后的数据末尾是0x00,而此时下一段数据的起始位又要加上0x00,此种情况时,H264规定加一个额外的0x03,这样就能预防压缩后的数据与起始位产生冲突.
- NALU: NAL Header(1B)+EBSP.NALU就是在EBSP的基础上加1B的网络头.
7.3 NALU详解
NALU详解结构图如下:
- NAL 单元是由一个NALU头部+一个切片.
- 切片又可以细分成"切片头+切片数据".
- 每个切片数据包括了很多宏块.
- 每个宏块包括了宏块的类型,宏块的预测,残差数据.
7.4 H264码流分层结构图
[图片上传失败...(image-6c074d-1602490909755)]
- A Annex格式数据 --> 起始码0x00+Nal Unit 数据
- NAL Unit --> NALU 头+NALU数据
- NALU 主体,是由切片组成.切片包括切片头+切片数据
- Slice数据: 宏块组成
- PCM类:宏块类型+pcm数据,或者宏块类型+宏块模式+残差数据
- Residual: 残差块.
参考:
CC老师_HelloCoder
音视频学习从零到整