视频编码知识
Posted SunnyBSK
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了视频编码知识相关的知识,希望对你有一定的参考价值。
记录一下学习视频编码的过程和自己的理解
视频
数字图像在计算机中的表示:二维矩阵,或三维矩阵(彩色)。
矩阵中的每个点为像素,数值的大小反应色彩的强度,颜色深度需要使用一定数据空间存储,每个色彩平面(RGB)常用为8bit,范围是0~255,那颜色深度就是24(8*3)bit。
分辨率:每英寸图像内有多少个像素点,分辨率主要包括:320 x 240、640 x 400、640 x 480、800 x 600、1024 x 768 1280 x 720(720P标清)、 1600 x 1200、1920 x 1080 (1080P全高清)
视频是单位时间内连续的n帧,n是帧率,单位是秒时等同于fps(frame per second)
播放一段视频每秒所需的数据量就是比特率(码率)单位是kb/s或Mb/s
比特率 = 宽 x 高 x 颜色深度 x 帧每秒
例如一段每秒30帧,分辨率是480x240的RGB视频,如果不做任何压缩,那码率为82944000(30x480x240x24)比特每秒。
一般来说同样分辨率下,视频的码率越大,说明表示像素的比特数越大,比特数大了就可以用来表示更细腻的颜色或画面信息,因此视频的压缩比越小,画面质量越高
巨大的数据量导致需要寻找一种方法保证人眼观感的同时尽可能压缩视频。
人眼的视觉特性:对亮度比色度更佳敏感
这张图能中的A B区域能反应人眼的视觉特性。
除了RGB颜色模型,还有其他模型,其中YCbCr可以将亮度(luma)和色度(chroma)分离,其中Y为亮度,Cb和Cr分别是蓝色色度和红色色度。
分离亮度和色度之后,可以将色度部分进行压缩。称为色度子采样,表示为 a❌y
- a: 水平采样参考,一般为4
- x:第一行的色度样本数
- y:第二行的色度样本数
常用的方案有:4:4:4(没有子采样),4:2:2, 4:2:0 等。如果使用4:2:0采样,可以减少一半的视频大小。
视频中连续的帧之间存在很强的相关性,也就是说当前帧中的很多部分与上一帧中的部分有重叠,这样的冗余为时间冗余。消除时间冗余是有条件的,连续的几帧中要有关键帧,剩下的帧可以参考关键帧来消除冗余,因此我们需要对帧分类。
帧类型
I帧(关键帧):I帧是自足的帧,不需要其他任何信息渲染,它与静态图像相似,因此第一帧通常是I帧,I帧一般会定期被插入到帧序列中。
P帧(预测帧):P帧可以利用之前的帧渲染,比如连续两帧中只有一小部分发生了运动,那我们只需知道当前帧和前一帧的差值,就能重建当前帧。
B帧(双向预测):B帧相比P帧预测原理一样,只是B帧可以参考前向和后向的帧。
通常情况下,占用比特大小:I帧 > P帧 > B帧
帧间预测
用来去除时间上的冗余
假设有两帧图像
用0减去1,就可以得到残差,这样传输残差比直接传输图像本身的数据量要小的多。
但是整帧之间的残差还是比较大的,所以更好的方法是将图像分块
分块之后我们尝试匹配0和1中的块。
假设我们找到了匹配块,就是球会从(0, 25)移动到(7, 26),那么x,y的值也称运动矢量,类似于传输整帧的残差,我们可以只传输运动矢量x=(7-0),y=(26-25),可以进一步压缩。
例子
帧内预测
消除了帧间的冗余,帧内还是有冗余信息,比如这部分体现在图像内相同的颜色区域,或者重复出现的内容。
帧内可以使用块中左上侧的所有像素来预测
例子
假设我们预测出块中的颜色在垂直方向上保持一致,那我们就可以根据垂直方向的最上方一行的像素推测整个块中的像素值。这种方法可能会出错,所以我们还是利用残差信息,用 预测值-实际值=残差,来减少数据量。
编解码器
通俗讲就是用于压缩或解压 视频音频的软件或硬件,因为我们需要在有限的带宽或存储空间中提高视频的质量。
标准是指人们为了统一数字视频流传输,制定的将原始视频转换为另一种视频格式的规则
通用工作流程
1. 分块
首先要将帧分为很多宏块(Macro Blocks),分块是有依据的,在静态背景使用较大的块,而在复杂的部分使用更加细小的划分方式。
通常编码器会将分区组织成片(Slice),宏块(MB)和子分区
例子
2. 预测
根据上面所说的两种方法压缩,帧间预测需要传运动矢量和残差,帧内预测需要传送预测方向和残差。
3. 转换
得到残差后,还可以进一步去除部分像素而不影响整体质量,最常用的方法是离散余弦变换(DCT),这种变换可以分离数据高频和低频的部分,其中大部分能量集中在低频,因此丢掉部分高频信息就能减少数据量,但不会牺牲很多图像的质量。
4. 量化
量化是将连续的值转为有限的离散值,一个最简单的例子是均匀量化,取一个MB,将所有像素都除以10,那么块中的像素值都会减小,小的数意味着可以用更少的比特表示,但量化并不是无损的,由于除法运算之后会使用取整,会引入量化噪声。
这只是最简单的例子,并没有考虑系数的重要性,因此实际编码器中的量化一般表示为量化矩阵。
5. 熵编码
我们得到量化后的块之后,还可以继续编码,此时块中非零系数集中在低频部分,高频系数大部分是0。使用zig-zag扫描将kuai中的二维数据转换为一维,也就是一串非零值集中在前面,0集中在后面的数字。有两种编码方式
-
CAVLC
-
CABAC
6. 比特流格式
完成上述步骤后,就可以传输压缩后的数据了,其中包含了一些信息,比如,颜色深度,分辨率,块划分方式,运动矢量,帧内预测方向,档次,级别,帧率,帧类型,帧号等重要信息。在H.264中规定信息将在宏帧内传输,称为NAL层,此时的数据就是一大堆十六进制数,每个部分分别代表着原始视频在压缩过程中的信息
总结
视频编码的目的是为了在有限的带宽中提升视频质量,为了达到这一目的,编码器负责分析原始视频,去除视频中的冗余,其中包括帧内预测和帧间预测,原理是利用残差和关键帧的信息就可以恢复原始图像,之后使用DCT将数据转换到频域去除高频部分,此时视频已经变成使用小数值表示的,包含非0和0值的二维矩阵。最后使用熵编码得到十六进制的比特流,传输时将比特流和编码器使用的压缩方法一起传输,解码器根据比特流和不同的模式解码原始视频。
转 音视频封装格式编码格式知识
常见的AVI、RMVB、MKV、ASF、WMV、MP4、3GP、FLV等文件其实只能算是一种封装标准。
一个完整的视频文件是由音频和视频2部分组成的。H264、Xvid等就是视频编码格式,MP3、AAC等就是音频编码格式。
例如:将一个Xvid视频编码文件和一个MP3音频编码文件按AVI封装标准封装以后,就得到一个AVI后缀的视频文件,这个就是我们常见的AVI视频文件了。
由于很多种视频编码文件、音频编码文件都符合AVI封装要求,则意味着即使是AVI后缀,也可能里面的具体编码格式不同。因此出现在一些设备上,同是AVI后缀文件,一些能正常播放,还有一些就无法播放。
同样的情况也存在于其他容器格式。即使RMVB、WMV等也不例外。部分技术先进的容器还可以同时封装多个视频、音频编码文件,甚至同时封装进字幕,如MKV封装格式。MKV文件可以做到一个文件包括多语种发音、多语种字幕,适合不同人的需要。
例如:MKV文件只要制作的时候同时加入国语和粤语发音的音轨和对应的简体、繁体字幕,播放的时候,你可以独立选择国语或粤语发音,并根据自己需要选择简体或繁体字幕,也可以选择不显示字幕。相当方便。
因此,视频转换需要设置的本质就是:A设置需要的视频编码、B设置需要的音频编码、C选择需要的容器封装。一个完整的视频转换设置都至少包括了上面3个步骤。
常用的有Xvid,H264,MPEG1,MPEG2。
Xvid:与RMVB格式差不多的压缩率,通用性很强,特别是用于家用DVD和便携式MP4等设备。
H264:压缩率最高的视频压缩格式,与其他编码格式相比,同等画面质量,文件体积最小,远远超过RMVB编码格式,电脑都可以播放,部分便携式视频设备也支持,如苹果播放器。PDA/PPC等设备也可以使用
MPEG1:其实就是VCD编码格式。
MPEG2:DVD编码格式。比MPEG1强,与MPEG1一样,已经落后的编码格式,压缩率都不高,编码后的文件体积大,多用于希望把网上下载的文件转换为VCD或DVD碟的时候。
常见的组合方式:
封装容器 视频流编码格式 音频流编码格式
AVI : Xvid MP3
AVI : Divx MP3
Matroska(后缀就是MKV): Xvid MP3
Matroska(后缀就是MKV): Xvid AAC
Matroska(后缀就是MKV): H264 AAC
MP4 : Xvid MP3
MP4 : H264 AAC
3GP : H.263 AAC
事实上,很多封装容器对音频编码和视频编码的组合方式放的很开,如AVI还可以使用H264+AAC组合,可以在具体使用中自己体会。尤其是MKV封装容器,基本无论什么样的组合都可以!但一般MKV用的最多的就是H264+AAC组合,此组合文件体积最小,清晰度最高。因此网上很多MKV视频都是高清晰度的。
从上表格可以看出,真正设置的重点在于音频编码和视频编码,封装容器多数时候只是关系到最后的文件后缀而已。起码初学者可以就这么理解。
一、音频编解码格式
*MPEG Audio Layer 1/2
*MPEG Audio Layer 3(MP3)
*MPEG2 AAC
*MPEG4 AAC
*Windows Media audeo v1/v2/7/8/9
*RealAudio cook/sipro(real media series)
*RealAudio AAC/AACPlus(real media series)
*QDesign Music 2(apple series)
是QDesign 公司开发的用于高保真高压缩率的编码方式,类似于MP3,不过比MP3要先进。支持流式播放.
*Apple MPEG-4 AAC(apple series)
*ogg(ogg vorbis音频)
*AC3(DVD 专用音频编码)
*DTS(DVD 专用音频编码)
*APE(monkey’s 音频)
*AU(sun 格式)
*FLAC(fress lossless 音频)
*M4A(mpeg-4音频)(苹果改用的名字,可以改成.mp4)
*MP2(mpeg audio layer2音频)
*WMA
二、视频编解码格式
*MPEG1(VCD)
*MPEG2(DVD)
*MPEG4(divx,xvid)
*MPEG4 AVC/h.264
*h.261
*h.262
*h.263
*h.263+
*h.263++
*MPEG-4 v1/v2/v3(微软windows media系列)
*Windows Media Video 7/8/9/10
*Sorenson Video 3(用于QT5,成标准了)(appleseries)
*RealVideo G2(real media series)
*RealVideo 8/9/10(real media series)
*Apple MPEG-4(apple series)
*Apple H.264(apple series)
*flash video
三、音视频文件格式
首先要分清楚媒体文件和编码的区别:文件是既包括视频又包括音频、甚至还带有脚本的一个集合,也可以叫容器;文件当中的视频和音频的压缩算法才是具体的编码。
*AVI :音视频交互存储,最常见的音频视频容器。支持的视频音频编码也是最多的
*MPG :MPEG编码采用的音频视频容器,具有流的特性。里面又分为 PS,TS 等,PS 主要用于 DVD 存储,TS 主要用于 HDTV。
*VOB :DVD采用的音频视频容器格式(即视频MPEG-2,音频用AC3或者DTS),支持多视频多音轨多字幕章节等。
*MP4 :MPEG-4编码采用的音频视频容器,基于 QuickTime MOV 开发,具有许多先进特性。
*3GP : 3GPP视频采用的格式,主要用于流媒体传送。
*ASF :Windows Media采用的音频视频容器,能够用于流传送,还能包容脚本等。
*RM : RealMedia 采用的音频视频容器,用于流传送。
*MOV : QuickTime 的音频视频容器,恐怕也是现今最强大的容器,甚至支持虚拟现实技术,Java 等,它的变种 MP4,3GP都没有这么厉害。
*MKV :MKV 它能把 Windows Media Video,RealVideo,MPEG-4 等视频音频融为一个文件,而且支持多音轨,支持章节字幕等。
*WAV :一种音频容器(注意:只是音频),大家常说的 WAV 就是没有压缩的 PCM 编码,其实 WAV 里面还可以包括 MP3 等其他ACM 压缩编码。
四、以文件名标识识别音频编码格式
*.aac
音频编码:aac
*.ac3
音频编码:ac3
*.ape
*.au
音频编码:pcm_s16be
*.m4a
音频编码:mpeg4 aac
*.mp2
*.mp3
*.ogg
音频编码:vorbis
*.wav
音频编码:pcm_s16le
*.flav
*.wma
音频编码:wma7x
五、以文件名标识识别音视频编码格式
1.*.MP4 (MP4 MPEG-4视频)
视频编码:mpeg4
音频编码:mpeg4 aac
2.*.3gp (3GPP 第三代合作项目)
视频编码:mpeg4
音频编码:amr_nb((mono, 8000 Hz, Sample Depth 16 bit,bitrate 12 kbps)
3.*.3g2 (3GPP 第三代合作项目2)
视频编码:mpeg4
音频编码:mpeg4 aac
4.*.asf (ASF 高级流格式)
视频编码:msmpeg4
音频编码:mp3
5.*.avi(AVI 音视频交错格式)
视频编码:mpeg4
音频编码:pcm_s161e
6.*.avi (divx 影片)
视频编码:mpeg4
音频编码:mp3
7.*.avi(xvid 视频)
视频编码:Xvid
音频编码:mp3
8.*.vob (DVD)
视频编码:mpeg2 video
音频编码:ac3
9.*.flv (flash 视频格式)
视频编码:
音频编码:mp3
10.*.mp4(iPod 320*240 MPEG-4 视频格式)
视频编码:mpeg4
音频编码:mpeg4 aac
11.*.mp4(iPod video2 640*480 MPEG-4 视频格式)
视频编码:mpeg4
音频编码:mpeg4 aac
12.*.mov (MOV 苹果quicktime 格式)
视频编码:mpeg4_qt
音频编码:mpeg4 aac_qt
13.*.mpg (mpeg1影片)
视频编码:mpeg1 video
音频编码:mp2
14.*.mpg (mpeg2 影片)
视频编码:mpeg2 video
音频编码:mp2
15.*.mp4(mpeg4 avc 视频格式)
视频编码:h.264
音频编码:mpeg4 aac
16.*.mp4 (PSP mpeg4 影片)
视频编码:Xvid
音频编码:mpeg4 aac
17.*.mp4 (PSP AVC 视频格式)
视频编码:h.264
音频编码:mpeg4 aac
18.*.rm (RM realvideo)
视频编码:rv10
音频编码:ac3
19.*.mpg (超级VCD)
视频编码:mpeg2 video
音频编码:mp2
20.*.swf (SWF 格式)
视频编码:
音频编码:mp3
21.*.mpg (video CD 格式)
视频编码:mpeg1 video
音频编码:mp2
22.*.vob (mpeg2 ps格式)
视频编码:mpeg2 video
音频编码:ac3
23.*.wmv(windows 视频格式)
视频编码:wmv3x
音频编码:wma7x
以上是关于视频编码知识的主要内容,如果未能解决你的问题,请参考以下文章