音视频入门基础知识

音视频入门基础知识

在这里插入图片描述

视频封装格式(MP4/MKV…) vs 视频编码格式(H.264/FLAC/AAC…)

  什么是影片?其实就是一张张图片,时间间隔很小的连续展示出来。人们就觉得画面中的人物在动,这就是影片。也就是说,电影的实质就是N多张图片的集合。那每张图片和帧又有什么关系呢?

  事实上,如果一部影片里面的图片,我们原封不动的全部存起来,空间会很大很大很大。但是,如果通过一定的算法,把每一张图片编码一下变成帧,再把帧连起来变成流,再把不同的流放到某个容器里面,这就是我们平常看见的电影文件了。

  MP4和MKV是你下载的视频文件最常见的种类。这些文件其实类似一个包裹,它的后缀则是包裹的包装方式。这些包裹里面,包含了视频(只有图像)、音频(只有声音)、字幕等。当播放器在播放的时候,首先对这个包裹进行拆包(专业术语叫demux), 把其中的视频、音频等拿出来,再进行解码播放。

  既然它们只是一个包裹,就意味着这个后缀不能保证里面的东西是啥,也不能保证到底有多少东西。包裹里面的每一件物品,我们称之为 轨道(track),一般有这么些:

  • 视频(Video): 一般来说肯定都有,但是也有例外,比如mka格式的外挂音轨,其实就是没视频的mkv。注意我们说到视频的时候,是不包括声音的。
  • 音频(audio):一般来说也肯定有,但是有些情况是静音的,就没必要带了。
  • 章节(Chapter): 蓝光原盘中自带的分段信息。如果文件带上了,那么你可以在播放器中看到带章节的效果:potplayer右键画面,选项-播放-在进度条上显示书签/章节标记;mpc-hc 右键画面,选项-调节-在进度条显示章节标记。
  • 字幕(Subtitles):有些时候文件自带字幕,并且字幕并非是直接整合于视频的硬字幕,那么就是一起被打包在封装容器中。

  其他可能还有附件等,不一一列举。每个类型也不一定只有一条轨道,比如经常见到带多音轨的MKV。

  每个轨道,都有自己的格式。比如大家常说的,视频是H.264,音频是AAC,这些就是每个轨道的格式。

  视频的格式,常见的有H.264(可以细分为8bit/10bit),H.265(当前也有8bit/10bit之分),RealVideo(常见于早期rm/rmvb),VC-1(微软主导的,常见于wmv)。基本上,H.264=AVC=AVC1, H.265=HEVC。

  音频的格式,常见的有 FLAC/ALAC/TruseHD/DTS-HD MA这四种无损,和AAC/MP3/AC3/DTS(Core)这四种有损。

在这里插入图片描述

  

视频的基础参数:分辨率,帧,帧率和码率

  视频是由连续的图像构成的。每一张图像,我们称为一帧(frame)。图像则是由像素(pixel)构成的。一张图像有多少像素,称为这个图像的分辨率。比如说1920×1080的图像,说明它是由横纵1920×1080个像素点构成。视频的分辨率就是每一帧图像的分辨率。

  一个视频,每一秒由多少图像构成,称为这个视频的帧率(frame-rate,fps)。常见的帧率有24000/1001=23.976, 30000/1001=29.970, 60000/1001=59.940, 25.000, 50.000等等。这个数字是一秒钟内闪过图像的数量。比如23.976,就是1001秒内,有24000张图像。视频的帧率是可以是恒定的(cfr, Const Frame-Rate),也可以是变化的(vfr, Variable Frame-Rate)。

  码率的定义是视频文件体积除以时间,单位一般是Kbps(Kbit/s)或者Mbps(Mbit/s)。注意,1B(Byte)=8b(bit)。所以一个24分钟,900MB的视频:

体积:900MB = 900MByte = 7200Mbit
时间:24min = 1440s
码率:7200/1440  = 5000 Kbps = 5Mbps

  当视频文件的时间基本相同的时候(比如现在一集番大概是24分钟),码率和体积基本上是等价的,都是用来描述视频大小的参数。长度分辨率都相同的文件,体积不同,实际上就是码率不同。

  码率也可以解读为单位时间内,用来记录视频的数据总量。码率越高的视频,意味着用来记录视频的数据量越多,潜在的解读就是视频可以拥有更好的质量。注意,仅仅是潜在,后文我们会分析为什么高码率不一定等于高画质。

  

  

码率控制CQP/CRF/ABR/CBR/VBV

  播放一段视频每秒所需的数据量就是它的比特率(即常说的码率)。

比特率 = 宽 * 高 * 颜色深度 * 帧每秒

  例如,一段每秒 30 帧,每像素 24 bits,分辨率是 480x240 的视频,如果我们不做任何压缩,它将需要 82,944,000 比特每秒或 82.944 Mbps (30x480x240x24)。

  

Ⅰ . CQP(Constant QP)

固定QP,最简单的码率控制方式,每帧图像都按照一个特定的QP来编码,每帧编码后的数据量有多大是未知的,既不是码率优先模型也不是质量优先模型,不过是实现最简单的模型;

适用场景:一般不建议使用这种方式,因为这种方式不考虑编码内容的复杂性,用相同的压缩比处理每一帧。出来的视频质量码率都不固定。个人觉得只有那种非常简单的场景,比如静止不变的场景运动量很小的场景可以尝试用,一遇到复杂场景,码率波动就非常大。或者在算法研究或者验证可以使用。

特点:

  • 瞬时码率会随场景复杂度波动;

  • 编码速度快,调控最简单,每帧的QP值相同;

  • x264和x265中支持CQP模式,libvpx不支持;

  • H.264中QP范围是[0, 51]。QP值越大表示越大的量化步长,编码视频的质量越低。QP为0表示进行无损编码;

Ⅱ . CRF(Constant Rate Factor)

恒定质量因子把某一个”视觉质量”作为输出目标。通过降低那些耗费码率但是又难以用肉眼察觉的帧(高速运动或者纹理丰富)的质量提升那些静态帧的码率来达到此目的。

特点:帧间QP变化,帧内宏块的QP变化,输出码率未知,各帧输出的视觉质量基本恒定,这种方式相当于固定质量模式+限制码率峰值的方式。

适用场景: 适用于对视频质量有一定要求的场合,CRF值可以简单理解为对视频质量期望的一个输出固定值,希望无论是在运动复杂场景下还是在静止简单情况下,都希望有一个稳定的主观视频质量可以选择该模式,该模式是视频质量优先模型。视频质量可以简单理解为视频的清晰度,像素的细腻程度和视频的流畅度。

特点:

  • 与恒定QP类似,但追求主观感知到的质量恒定,瞬时码率也会随场景复杂度波动,视频帧之间或者内部宏块之间的QP值都不一样;

  • 对于快速运动或细节丰富的场景会适当增大量化失真(因为人眼不敏感),反之对于静止或平坦区域则减少量化失真;

  • CRF是x264和x265的默认码率控制方式,也可用于libvpx;

  • CRF值越大视频压缩率越高,但视频质量越低,各codec的CRF取值范围一般[0-51],但是一般默认值x264用23,x265库默认为28;

  • 如果你不确定要使用什么CRF,从默认值开始,并根据对输出的主观印象进行更改。如果质量没有足够好则较低的CRF。如果文件太大了则选择更高的CRF。更改±6会导致码率大小的一半/两倍左右的变化,±1会导致码率10%左右的变化。

  

Ⅲ . CBR:(Constant Bit Rate)

恒定码率一定时间范围内比特率基本保持的恒定,属于码率优先模型。

适用场景: 一般也不建议使用这种方式,虽然输出的码率总是处于一个稳定值,但是质量不稳定,不能充分有效利用网络带宽,因为这种模型不考虑视频内容的复杂性,把所有视频帧的内容统一对待。但是有些编码软件只支持固定质量或者固定码率方式,有时不得不用。用的时候在允许的带宽范围内尽可能把带宽设置大点,以防止复杂运动场景下视频质量很低,如果设置的不合理,在运动场景下直接就糊的看不成了。

特点:

  • 码率稳定,但是质量不稳定,带宽有效利用率不高,特别当该值设置不合理,在复杂运动场景下,画面非常模糊,非常影响观看体验;

  • 但是输出视频码率基本稳定,便于计算视频体积大小;

  

Ⅳ . VBR:(Variable Bit Rate)

可变码率动态比特率,表示编码器会根据图像内容的复杂度(实际上是帧间变化量的大小)来动态调整输出码率,图像复杂则码率高,图像简单则码率低。输出码率会在一定范围内波动,对于小幅晃动,方块效应会有所改善,但对长时间剧烈晃动仍无能为力。这种编码方式适用于本地存储本地编码这种情况对视频和音频质量要求比较高但是又不关心带宽的场景可以采用该编码方式

有两种调控模式:质量优先模式和2PASS二次编码模式。

质量优先模式:

不考虑输出视频文件的大小,完全按照视频的内容复杂程度来分配码率,这样视频的播放效果质量最好。

二次编码方式2PASS:

第一次编码检测视频内容的简单和复杂部分,同时确定简单和复杂的比例。

第二遍编码会让视频的平均码率不变,复杂的地方分配多bit,简单地方分配少bit。这种编码虽然很好,但是速度会跟不上。

适用场景: VBR适用于那些对带宽和编码速度不太限制,但是对质量有很高要求的场景。特别是在运动的复杂场景下也可以保持比较高的清晰度且输出质量比较稳定,适合对延时不敏感的点播,录播或者存储系统。

特点:

  • 码率不稳定,质量基本稳定且非常高;

  • 编码速度一般比较慢,点播、下载和存储系统可以优先使用,不适合低延时、直播系统;

  • 这种模型完全不考虑输出的视频带宽,为了质量,需要多少码率就占用多少,也不太考虑编码速度;

ABR:(Average Bit Rate)

恒定平均目标码率简单场景分配较低bit,复杂场景分配足够bit,使得有限的bit数能够在不同场景下合理分配,这类似VBR。同时一定时间内,平均码率又接近设置的目标码率,这样可以控制输出文件的大小,这又类似CBR。可以认为是CBR和VBR的折中方案,这是大多人的选择。特别在对质量和视频带宽都有要求的情况下,可以优先选择该模式,一般速度是VBR的两倍到三倍,相同体积的视频文件质量却比CBR好很多。

适用场景: ABR在直播和低延时系统用的比较多,因为只编码了一次,所以速度快,同时兼顾了视频质量和带宽,对于转码速度有要求的情况下也可以选择该模式。B站的大部分视频就选择了该模式。

特点:

  • 视频质量整体可控,同时兼顾了视频码率和速度,是一个折中方案,实际用的比较多;

  • 使用过程一般要让调用方设置,最低码率、最高码率和平均码率,这些值要尽可能设置合理点;

总结:

  上面介绍了几种码率调控方案,在不同的编码器中有不同的叫法和称呼,细节可能不一样。但是基本都是通过影响QP的大小,然后进一步影响量化过程的颗粒程度实现的。具体在使用时需要进一步参考具体编码器实现。

  一般优先使用ABR,在速度,码率大小,质量方面都能取得比较满意的平衡。其它VBR、CBR、CRF都有自己的场景,在使用时需要有条件使用。

  

  

逐行扫描技术

  在早期,工程师们想出了一项技术能将视频的感官帧率加倍没有消耗额外带宽。这项技术被称为隔行扫描;总的来说,它在一个时间点发送一个画面——画面用于填充屏幕的一半,而下一个时间点发送的画面用于填充屏幕的另一半。

  如今的屏幕渲染大多使用逐行扫描技术。这是一种显示、存储、传输运动图像的方法,每帧中的所有行都会被依次绘制。

在这里插入图片描述

  

  

色深(8bit、10bit)

  色深(bit-depth),就是我们通常说的8bit和10bit,是指每个通道的精度(可以简单理解为一种颜色的不同亮度)。8bit就是每个通道用一个8bit整数(0~255)代表,10bit就是用10bit整数(0~1023)来显示,16bit则是(0~65535)。注意,上文的表述是不严谨的,视频在编码的时候,并非一定能用到0~255的所有范围,而是可能有所保留,只用到一部分,比如16~235。这我们就不详细展开了。

  你的显示器是8bit的,代表它能显示RGB每个通道0~255所有强度。但是视频的色深是YUV的色深,播放的时候,YUV需要通过计算转换到RGB。因此,10bit的高精度是间接的,它使得运算过程中精度增加,以让最后的颜色更细腻。

显示器上一个像素点是三个颜色的灯

如何理解8bit显示器,播放10bit是有必要的呢:
一个圆的半径是12.33m, 求它的面积,保留两位小数。
半径的精度给定两位小数,结果也要求两位小数,那么圆周率精度需要给多高呢?也只要两位小数么?
取pi=3.14, 面积算出来是477.37平方米
取pi=3.1416,面积算出来是477.61平方米
取pi精度足够高,面积算出来是477.61平方米。所以取pi=3.1416是足够的,但是3.14就不够了。

  换言之,即便最终输出的精度要求较低,也不意味着参与运算的数字以及运算过程,可以保持较低的精度。在最终输出是8bit RGB的前提下,10bit YUV比起8bit YUV依旧具有精度优势的原因就在这里。事实上,8bit YUV转换后,覆盖的精度大概相当于8bit RGB的26%,而10bit转换后的精度大约可以覆盖97%——你想让你家8bit显示器发挥97%的细腻度么? 看10bit吧。

  8bit精度不足,主要表现在亮度较低的区域,容易形成色带;

  

  

图像的表示方法:RGB模型 vs YUV模型

RGB

  光的三原色是红(Red)、绿(Green)、蓝(Blue)。现代的显示器技术就是通过组合不同强度的三原色,来达成任何一种可见光的颜色。图像储存中,通过记录每个像素红绿蓝强度来记录图像的方法,称为RGB模型 (RGB Model)。常见的图片格式中,PNG和BMP这两种就是基于RGB模型的。

  假如每个颜色(平面)的强度占用 8 bit(取值范围为 0 到 255),那么颜色深度就是 24(8*3)bit也就是3Byte。我们还可以推导出我们可以使用 2 24 2^{24} 224 种不同的颜色。

YUV

  除了RGB模型,还有一种广泛采用的模型,称为YUV模型,又被称为亮度-色度模型(Luma-Chroma)。它是通过数学转换,将RGB三个通道转换为一个代表亮度的通道(Y,又称为Luma),和两个代表色度的通道(UV,并成为Chroma)。

  YUV模型下,还有不同的实现方式。举个用的比较多的YCbCr模型: 它把RGB转换成一个亮度(Y),和 蓝色色度(Cb) 以及 红色色度(Cr)。

转换过程

1.RGB —— > YUV
  在做RGB信号到YUV信号的转换时,一般是先转换到YUV444格式(参见色度信号取样格式),然后再将UV信号的分辨率降低,变成我们所需的格式。

2.YUV —— > RGB
  在做YUV到RGB的转换时,首先需要将缩水的UV信号的分辨率拉升到与Y信号相同的分辨率,然后再转换到RGB信号。在播放视频或显示图像的时候,我们需要将YUV信号转换为RGB信号。这个步骤称为渲染(Rendering)。

转换公式

下面是RGB与YUV之间的转换公式:
在这里插入图片描述

一般这一步骤可通过编码矩阵来实现,写成矩阵的形式为:

在这里插入图片描述

上图中的两个矩阵即为编码矩阵

YUV的优势

  在图像视频的加工与储存中,YUV格式一般更受欢迎,理由如下:

  1. 人眼对亮度的敏感度远高于色度,因此人眼看到的有效信息主要来自于亮度。 YUV模型可以将绝大多数的有效信息分配到Y通道,UV通道相对记录的信息少的多。相对于RGB模型较为平均的分配,YUV模型将多数有效信息集中在Y通道,不但减少了冗余信息量,还为压缩提供了便利。
  2. 保持了对黑白显示设备(黑白电视)的向下兼容。
  3. 图像编辑中,调节亮度和颜色饱和度,在YUV模型下更方便。

  几乎所有的视频格式,以及广泛使用的JPEG图像格式,都是基于YCbCr模型的。播放的时候,播放器需要将YCbCr的信息,通过计算,转换为RGB,这个步骤称为渲染(Rendering)

既然YUV更有优势,为什么还要保留RGB呢?

因为目前人类发明的所有彩色的输入输出设备,本质上都只支持RGB数据。哪怕设备允许YUV的输入输出,那也是经过内部的数据转换而间接支持。

  

  

消除冗余——1

  我们认识到,不对视频进行压缩是不行的;一个单独的一小时长的视频,分辨率为 720p 和 30fps 时将需要 278GB。仅仅使用无损数据压缩算法——如 DEFLATE(被PKZIP, Gzip, 和 PNG 使用)——也无法充分减少视频所需的带宽,我们需要找到其它压缩视频的方法。

我们使用乘积得出这个数字 1280 x 720 x 24 x 30 x 3600 (宽,高,每像素比特数,fps 和秒数)

  为此,我们可以利用视觉特性:和区分颜色相比,我们区分亮度要更加敏锐。时间上的重复:一段视频包含很多只有一点小小改变的图像。图像内的重复:每一帧也包含很多颜色相同或相似的区域。

  

色度采样

  在YUV模型的应用中,Y和UV的重要性是不等同的。图像视频的实际储存和传输中,通常将Y以全分辨率记录,UV以减半甚至1/4的分辨率记录。 这个手段被称为色度子采样(Chroma Sub-Sampling)。色度子采样可以有效减少传输带宽,和加大UV平面的压缩率,但是不可避免的会损失UV平面的有效信息

  我们平常的视频,最常见的是420采样。配合YUV格式,常常被写作yuv420,这种就是色彩子采样。

在这里插入图片描述

  现在我们发现 yuv444,yuv422,yuv420 yuv 等像素格式的本质是:每个图形像素都会包含亮度值,但是某几个图形像素会共用一个色度值,这个比例关系就是通过 4 x 2 的矩形参考块来定的。这样很容易理解类似 yuv440,yuv420 这样的格式了。

例如 YCbCr 4:2:0 合并
这是使用 YCbCr 4:2:0 合并的一个图像的一块,注意我们每像素只花费 12bit。

计算得到,Y:8bit,Cb:2bit,Cr:2bit

因为一个图像像素只占用1/4个UV对,YUV各占8bit,故总共8+2+2 = 12bit

  

消除冗余——2

  前面我们计算过我们需要 278GB 去存储一个1小时长,分辨率在720p和30fps的视频文件。如果我们使用 YCbCr 4:2:0 我们能剪掉一半的大小(139GB),但仍然不够理想。我们通过将宽、高、颜色深度和 fps 相乘得出这个值。前面我们需要 24 bit,现在我们只需要 12 bit。

  

视频编码之I帧 、P帧、B帧

视频传输(存储)原理

  视频是利用人眼视觉暂留的原理,通过播放一系列的图片,使人眼产生运动的感觉。单纯传输视频画面,视频量非常大,对现有的网络和存储来说是不可接受的。为了能够使视频便于传输和存储,人们发现视频有大量重复的信息,如果将重复信息在发送端去掉,在接收端恢复出来,这样就大大减少了视频数据的文件,因此有了H.264视频压缩标准

  视频里边的原始图像数据会采用 H.264编码格式进行压缩,音频采样数据会采用 AAC 编码格式进行压缩。视频内容经过编码压缩后,确实有利于存储和传输。不过当要观看播放时,相应地也需要解码过程。因此编码和解码之间,显然需要约定一种编码器和解码器都可以理解的约定。就视频图像编码和解码而言,这种约定很简单:

   编码器将多张图像进行编码后生产成一段一段的 GOP ( Group of Pictures ) , 解码器在播放时则是读取一段一段的 GOP 进行解码后读取画面再渲染显示。 GOP ( Group of Pictures) 是一组连续的画面,由一张 I 帧和数张 B / P 帧组成,是视频图像编码器和解码器存取的基本单位,它的排列顺序将会一直重复到影像结束。I 帧是内部编码帧(也称为关键帧),P帧是前向预测帧(前向参考帧),B 帧是双向内插帧(双向参考帧)。简单地讲,I 帧是一个完整的画面,而 P 帧和 B 帧记录的是相对于 I 帧的变化。如果没有 I 帧,P 帧和 B 帧就无法解码。

  在H.264压缩标准中I帧、P帧、B帧用于表示传输的视频画面。

在这里插入图片描述

1、I帧

  I帧又称帧内编码帧,是一种自带全部信息的独立帧,无需参考其他图像便可独立进行解码,可以简单理解为一张静态画面。视频序列中的第一个帧始终都是I帧,因为它是关键帧。

2、P帧

  P帧又称帧间预测编码帧,需要参考前面的I帧才能进行编码。表示的是当前帧画面与前一帧(前一帧可能是I帧也可能是P帧)的差别。解码时需要用之前缓存的画面叠加上本帧定义的差别,生成最终画面。与I帧相比,P帧通常占用更少的数据位,但不足是,由于P帧对前面的P和I参考帧有着复杂的依耐性,因此对传输错误非常敏感。

在这里插入图片描述

3、B帧

  B帧又称双向预测编码帧,也就是B帧记录的是本帧与前后帧的差别。也就是说要解码B帧,不仅要取得之前的缓存画面,还要解码之后的画面,通过前后画面的与本帧数据的叠加取得最终的画面。B帧压缩率高,但是对解码性能要求较高。

在这里插入图片描述

总结:

  I帧只需考虑本帧;P帧记录的是与前一帧的差别;B帧记录的是前一帧及后一帧的差别,能节约更多的空间,视频文件小了,但相对来说解码的时候就比较麻烦。因为在解码时,不仅要用之前缓存的画面,而且要知道下一个I或者P的画面,对于不支持B帧解码的播放器容易卡顿。

在这里插入图片描述

  视频监控系统中预览的视频画面是实时的,对画面的流畅性要求较高。采用I帧、P帧进行视频传输可以提高网络的适应能力,且能降低解码成本所以现阶段的视频解码都只采用I帧和P帧进行传输。海康摄像机编码,I帧间隔是50,含49个P帧。

猜你喜欢

转载自blog.csdn.net/qq_40342400/article/details/129621369