PSNR
H.264是一种视频编码标准,而PSNR(Peak Signal-to-Noise Ratio)是一种衡量图像或视频质量的指标。PSNR是通过比较原始图像和编码后重建图像的峰值信噪比来计算的。在H.264编码中,PSNR通常用于衡量编码后视频的质量。
PSNR的计算公式为:
PSNR = 10 * log10((MAX_I^2) / MSE)
其中,MAX_I是图像中可能的最大像素值(对于8位图像,MAX_I=255),MSE是原始图像和重建图像之间的均方误差。PSNR的值越高,表示图像质量越好。
在H.264编码中,PSNR通常用于衡量不同编码参数和设置下的视频质量。编码器可以通过调整量化参数(QP)、帧率、分辨率等参数来影响编码后的视频质量和PSNR值。一般来说,较低的量化参数和较高的比特率会导致更高的PSNR值和更好的视频质量,但也会增加编码后的文件大小。
需要注意的是,PSNR虽然是一种常用的视频质量评估指标,但它并不总是与人类视觉感知完全一致。在某些情况下,即使PSNR值很高,人类观察者仍然可能感知到视频质量的差异。因此,在评估H.264编码的视频质量时,除了PSNR外,还需要考虑其他因素,如主观视觉感受、编码效率、文件大小等。
High10
在H.264视频编码标准中,High和High10是两个不同的Profile(配置文件),它们定义了编码器和解码器支持的特性集合和参数限制。
-
High Profile (HP): 这是H.264标准中的一个常用Profile,它支持各种常用的编码特性,包括CABAC(Context-Adaptive Binary Arithmetic Coding)熵编码、8x8和4x4整数变换等。High Profile适用于大多数标准清晰度和高清晰度的视频应用。
-
High 10 Profile (Hi10P): 这是High Profile的一个扩展,它支持10位颜色深度的编码,而不是通常的8位。10位颜色深度提供了更广泛的颜色范围和更平滑的颜色渐变,从而能够呈现更高质量的视频。High 10 Profile是在High Profile的基础上增加了对10位颜色深度的支持,其他特性与High Profile相同。
Tiled与Linear
-
Linear(线性):
- 在线性存储中,图像数据是按照像素在屏幕上的顺序连续存储的。这通常意味着数据从图像的左上角开始,按照从左到右、从上到下的顺序排列。
- 线性布局是简单的,因为数据访问是连续的,这对于某些算法和硬件实现来说是高效的。
- 然而,线性存储可能不是最优的,特别是当处理大型图像或需要高效访问特定区域时。
-
Tiled(分块):
- 在分块存储中,图像被分成固定大小的块(或“tile”),每个块独立存储。
- 分块存储可以优化某些操作,特别是当这些操作仅涉及图像的一小部分时。例如,局部变换或滤波可以仅在一个或几个块上执行,而不需要处理整个图像。
- 分块存储也可以提高缓存效率,因为当处理图像时,相邻的像素往往被一起访问,而它们可能位于相同的块中。
AVC HEVC
H.264(也称为AVC,Advanced Video Coding)
HEVC(High Efficiency Video Coding),也被称为H.265
DPB
在H.264视频编码标准中,DPB(Decoded Picture Buffer)是一个关键组件,用于存储解码后的图像帧,以供后续的帧间预测编码和解码使用。DPB中存储的帧可以是参考帧(用于预测编码新帧)或非参考帧(不用于预测,但可能需要显示或丢弃)。
"DPB flush"是一个操作,用于清除DPB中的所有帧。在某些情况下,解码器可能需要执行DPB flush操作,以确保解码过程与编码器的预期同步,或者为了响应某些特定的解码条件或错误恢复机制。
DPB flush操作通常发生在以下几种情况:
-
IDR(Instantaneous Decoding Refresh): 当解码器遇到IDR NAL单元时,它必须丢弃DPB中的所有帧,并从当前IDR AU开始重新解码。这是一种强制性的刷新机制,用于确保解码器的状态与编码器完全同步。
-
Slice Header中的
discardable_flag
: 在Slice头部中,有一个discardable_flag
标志。如果设置为1,这意味着该Slice对应的帧可以被丢弃而不影响后续帧的解码。在某些情况下,解码器可能会选择执行DPB flush操作来丢弃这些帧。 -
解码错误: 如果解码器在解码过程中遇到错误,并且无法通过其他方式恢复,它可能会选择执行DPB flush来清除所有可能受到影响的帧,并从下一个IDR AU重新开始解码。
-
序列结束: 当解码器处理完一个视频序列的所有数据时,它可能会执行DPB flush来清除DPB中的所有帧,为处理下一个视频序列做准备。
执行DPB flush操作时,解码器会清除DPB中的所有帧,并将DPB的状态重置为初始状态。这意味着所有存储在DPB中的帧都将被丢弃,不再用于后续的预测编码或解码。
AU
在H.264中,AU(访问单元)是一个重要的概念,它代表了一组连续的NAL单元。这些NAL单元在解码时需要一起处理,因为它们共同构成了视频流中的一个逻辑单元。AU可以包含一个或多个NAL单元,这些NAL单元在逻辑上是相关的,并且通常属于同一个时间点的视频帧。
IDR AU(Instantaneous Decoding Refresh AU)是一种特殊的AU,它包含了一个IDR NAL单元。IDR NAL单元用于指示解码器丢弃之前所有的参考帧,并从当前AU开始重新解码。这在某些场景下是非常有用的,例如当网络出现错误或丢包时,解码器可以通过找到IDR AU的位置来进行解码刷新,从而恢复正确的解码状态。
GOP与SPS关系
对于一个1080p的H.264序列文件,SPS(序列参数集)通常也只有一个。SPS包含了整个视频序列的全局参数,如分辨率、帧率、编码模式等。对于1080p的视频,SPS中会包含表明分辨率为1920x1080的参数。尽管在视频流中可能存在多个IDR(Instantaneous Decoding Refresh)帧,每个IDR帧可能携带新的PPS(图像参数集),但SPS通常在整个视频序列中只需要定义一次,并在整个序列中保持不变,SPS不是附在I帧或者P帧上面的,SPS是一个单独的NALU type,是与IPB帧同级别的NALU slice
intraPeriod
在H.264编码中,GOP结构定义了帧的排列方式,包括I帧、P帧和B帧的数量和顺序。intra_period
通常用于指定在编码过程中插入I帧的周期。换句话说,它定义了连续两个I帧之间应有多少个非I帧(P帧和B帧)。这个值决定了GOP的长度和编码视频流的特性。intra_period
和gop size
在视频编码中都与关键帧(I帧)的插入间隔有关,但它们的具体含义和用途可能略有不同。gop size
是较为普遍和直接的概念,它指的是两个连续的I帧之间的帧数。换句话说,它定义了一个GOP(Group of Pictures)中除了I帧以外的P帧和B帧的数量。而intra_period
在某些上下文中可能与gop size
相似,但并不是一个通用或标准的术语。它可能是特定编码库或工具中的参数,用于指定插入I帧的周期。虽然其本质目的与gop size相似,即控制I帧的插入频率,但具体实现和用法可能因工具或库的不同而有所差异
码率
码率×时长=视频size
分辨率×bit深度×色彩模式×帧率×时长=yuv视频size
Slice
在H.264编码中,Slice的内部结构主要由Slice Header和Slice Data两部分组成。
-
Slice Header:Slice Header包含了Slice的一些重要信息,用于解码器正确解码Slice Data。Slice Header的主要内容包括:
- Slice类型:这决定了Slice的编码方式,例如I-Slice只包含I宏块,P-Slice包含P宏块,B-Slice包含B宏块。
- 宏块类型:这决定了宏块的编码方式,如是否进行帧内预测、帧间预测等。
- Slice的起始和结束宏块地址:这告诉解码器Slice在帧中的位置。
- 量化参数(Quantization Parameter, QP):这影响了视频的质量和压缩比。
- 其他参数:如参考帧信息、滤波参数等。
-
Slice Data:Slice Data是Slice的主要部分,它包含了实际的像素数据。Slice Data主要由一系列宏块(Macroblock)组成,每个宏块包含了16x16的亮度像素和附加的8x8的色度像素块。宏块中的数据是以4x4的块为单位进行编码的,每个4x4块可能进行DCT变换、量化、熵编码等步骤。
-
在H.264编码中,一帧图像可以编码为一个或多个slice。对于I帧来说,虽然它包含了完整的图像信息,但也可以根据编码器的设置和实际需求被分成多个slice
NALU与Slice的关系
在H.264视频编码标准中,编码后的视频数据被封装成NALU进行传输。每个NALU由一个NAL单元头和NAL单元载荷组成,其中NAL单元载荷部分可以包含不同类型的编码数据,而slice的编码数据就是其中之一。同样sps和pps也是nalu的负载类型之一。
当一帧图像被分割成多个slice进行编码时,每个slice的编码数据会被分别封装进不同的NALU中(尽管在某些情况下,一个slice的数据也可能被分割并封装进多个NALU中,但这种情况较少见)。这些包含slice数据的NALU在视频流中按顺序排列,解码器在解码时会按照这些NALU的顺序来恢复出原始的slice数据,并进一步恢复出完整的视频帧。
因此,可以说NALU是包含slice的,它们之间的关系是封装与被封装的关系。NALU作为网络传输的基本单元,为slice数据的传输提供了便利,同时也支持了视频数据的错误检测、同步和传输优先级控制等功能。
GOP
H.264中的GOP(Group of Pictures)是指一组连续的画面,也可以理解为两个I帧(关键帧)之间的间隔。在视频编码中,GOP是一个重要的概念,它决定了视频流的编码结构和解码效率。
GOP的主要作用是限制编码器中参考帧的数量,从而减少编码和解码时的计算复杂度。在H.264中,每个帧都可以是I帧、P帧或B帧,其中I帧是完整编码的帧,不依赖于其他帧进行解码,而P帧和B帧则依赖于前面的I帧或P帧进行解码。为了限制参考帧的数量,编码器会将帧组织成一系列的GOP,每个GOP都以一个I帧开始,后面跟着一系列的P帧和B帧。
GOP的大小(即两个I帧之间的间隔)对视频流的编码效率和解码性能有着重要的影响。较小的GOP大小意味着编码器中需要存储的参考帧数量较少,从而减少了编码和解码时的内存占用和计算复杂度。但是,较小的GOP大小也会导致编码效率降低,因为每个GOP中的帧之间相关性较小,导致编码时的冗余信息较多。相反,较大的GOP大小可以提高编码效率,因为帧之间的相关性更大,但是会增加编码器和解码器的内存占用和计算复杂度。
在实际应用中,GOP大小的选择需要根据具体的应用场景和需求进行权衡。对于实时性要求较高的应用,如视频会议、视频聊天等,通常需要选择较小的GOP大小以保证解码的实时性。而对于需要较高压缩比的应用,如视频存储、流媒体传输等,可以选择较大的GOP大小以提高编码效率
h264解码器中的FBC
在H.264视频解码器中,Frame Buffer Compressor是一个硬件块,用于管理解码后的帧的缓冲和压缩。这个硬件块的主要作用是优化内存使用和提高解码效率。
当解码器解码视频流时,它会生成解码后的帧,并将这些帧存储在帧缓冲区中。由于视频流可能包含大量的帧,如果直接存储所有解码后的帧,将会消耗大量的内存资源。因此,Frame Buffer Compressor硬件块被引入来压缩和解压缩帧缓冲区中的帧,以减少内存占用。
Frame Buffer Compressor硬件块通常具有以下功能:
- 压缩帧缓冲区中的帧:Frame Buffer Compressor可以对帧缓冲区中的帧进行压缩,以减少内存占用。压缩算法可以根据具体的实现和需求进行选择,常见的压缩算法包括有损压缩和无损压缩。
- 解压缩需要显示的帧:当需要显示某个帧时,Frame Buffer Compressor会将其从压缩状态解压缩回原始格式,以便将其传递给显示设备。解压缩过程需要快速且高效,以确保视频的流畅播放。
- 管理帧缓冲区的空间:Frame Buffer Compressor还负责管理帧缓冲区的空间分配和回收。它可以根据需要动态地调整帧缓冲区的大小,以适应不同大小和复杂度的视频流。
显示顺序与解码顺序
通常情况下,解码顺序号按照帧的出现顺序递增,即每个新帧的解码顺序号比前一个帧的解码顺序号大1。然而,需要注意的是,在某些特殊情况下,如IDR(Immediate Refresh)帧,解码顺序号可能会被重置。显示顺序由图像顺序计数POC(Picture Order Count)决定。POC是一个用于标识帧显示顺序的数值,它考虑了帧之间的依赖关系和编码特性。解码器在解码过程中会计算每个帧的POC,并按照POC的顺序将帧传递给显示设备。
由于H.264采用了帧间预测技术,解码顺序和显示顺序之间可能会存在差异。例如,B帧在解码过程中可能需要依赖于未来的帧进行解码,但在显示时却需要被插入到它们依赖的帧之间。因此,解码器在解码完成后会根据帧的POC对帧进行重新排序,以确保它们按照正确的顺序显示。
display reordering
在H.264视频编码标准中,Display Reordering(显示重排序)是一个重要的概念,它与解码后的帧的显示顺序有关。在视频压缩和解码过程中,由于采用了帧间预测技术,解码后的帧并不总是按照它们原始的显示顺序到达解码器输出。因此,Display Reordering机制用于调整帧的显示顺序,以确保它们按照正确的顺序在显示设备上呈现。
由于B帧依赖于未来的帧进行解码,解码器在解码B帧时可能还没有接收到所有依赖的帧。因此,解码器需要将解码后的帧存储在缓冲区中,直到所有依赖的帧都可用为止。一旦所有依赖的帧都可用,解码器就可以按照正确的顺序重新排列这些帧,并将它们传递给显示设备
QP
在H.264编码中,QP(Quantization Parameter,量化参数)是一个关键概念。H.264编码时,会将每一帧的图像分为多个宏块,每个宏块编码后都有一个QP值。对于每一帧图像来说,都会有一个最大QP值和最小QP值,即max_qp和min_qp。
QP的取值范围通常为0到51。当QP取最小值0时,表示量化最精细;相反,当QP取最大值51时,表示量化是最粗糙的。QP和Qstep(量化步长)具有线性相关性,Qstep随着QP的增加而增加。量化是在不降低视觉效果的前提下减少图像编码长度,减少视觉恢复中不必要的信息。
在H.264编码中,min_qp设置编码器可以使用的最小量化器。量化参数越小,输出越接近输入。在某些情况下,编码器的输出可以和输入看起来完全一样,尽管它们并不是精确相同的。如果开启了自适应量化器(默认开启),通常不建议提高min_qp的值,因为这可能会降低帧的平坦部分的质量。
相反,max_qp是设置编码器可以使用的最大量化器,其默认值51是H.264标准中的最大值,但使用此值可能会导致输出质量非常低。
maxdpbsize
在H.264/AVC(Advanced Video Coding)标准中,MaxDpbSize
(Maximum Decoding Picture Buffer Size)是一个关键参数,它定义了解码器为存储解码后的图像(帧)所需的最大缓冲区大小(以帧为单位)。这个参数对于解码器实现和性能优化是非常重要的,因为它直接影响到解码器能够同时处理多少帧而不引起溢出。
MaxDpbSize
的具体值取决于视频流的几个因素,包括:
-
Level(级别):H.264标准定义了多个级别,每个级别都对应一个特定的
MaxDpbSize
最大值。级别越高,通常允许的最大MaxDpbSize
也越大。级别不仅与MaxDpbSize
有关,还限制了比特率、帧率和分辨率等其他参数。 -
Profile(配置文件):不同的H.264配置文件(如Baseline, Main, Extended, High等)也可能对
MaxDpbSize
有不同的限制。 -
Sequence Parameter Set (SPS):在视频流的SPS中,会明确指定
MaxDpbSize
的值。SPS是H.264比特流中的一个重要组成部分,用于传递序列级别的编码参数。
解码器需要确保在解码过程中不会超出MaxDpbSize
所定义的缓冲区大小。如果超出了这个限制,解码器可能需要丢弃一些帧或者采取其他措施来避免缓冲区溢出。
MaxDpbSize
与max_dec_frame_buffering
参数有关联,但它们不是同一个概念。max_dec_frame_buffering
是编码器用来指示解码器应该准备的最大解码帧缓冲区的参数。而MaxDpbSize
则是解码器实际使用的最大缓冲区大小,这个值可能由编码器通过SPS指定,也可能由解码器根据级别和配置文件自动确定。
在实际应用中,理解MaxDpbSize
和如何配置它是非常重要的,因为它直接影响到解码器的内存使用和性能。如果配置不当,可能会导致解码器无法正常工作或者出现性能问题。
后处理
解码的后处理过程是对解码后得到的原始帧进行一系列优化和增强操作,以提高视频的质量和观看体验。这个过程可能包括以下几个步骤:
-
去块滤波(Deblocking Filter):在视频编码过程中,为了提高压缩效率,编码器可能会引入块效应,即在块的边界处出现不连续或明显的分界线。去块滤波器的目的是减少或消除这些块效应,使图像看起来更加平滑和自然。
-
环路滤波(Loop Filter):在某些视频编码标准中,如HEVC(H.265),环路滤波器被用于进一步改善解码后的图像质量。环路滤波器可以减少编码和解码过程中引入的失真和噪声,提高图像的清晰度和细节。
-
色度子采样格式转换:在视频编码中,为了节省带宽和存储空间,通常会采用色度子采样(Chroma Subsampling)技术,即减少色度分量(通常是红色和蓝色分量)的分辨率。在解码后,可能需要将色度分量恢复到原始分辨率,以获得更好的图像质量。
-
色彩空间转换:解码器可能还需要进行色彩空间转换,将解码后的帧从一种色彩空间(如YUV)转换到另一种色彩空间(如RGB),以适应显示设备或后续处理的要求。
-
缩放和裁剪:如果解码后的帧的分辨率与显示设备的分辨率不匹配,可能需要进行缩放操作。此外,根据需要对帧进行裁剪,以去除不需要的边缘或黑边。
-
帧率上转换/下转换:如果解码后的视频的帧率与显示设备的帧率不匹配,可能需要进行帧率上转换(增加帧率)或帧率下转换(减少帧率)操作,以匹配显示设备的帧率。
-
图像增强:可能还包括一些图像增强技术,如对比度增强、亮度调整、锐化、降噪等,以进一步提高图像的视觉质量。
需要注意的是,后处理过程的具体步骤和参数可能因解码器的实现和配置而有所不同。此外,后处理过程可能会对计算资源和性能产生一定的影响,因此需要根据实际应用场景和需求进行权衡和优化。
前处理
解码器的前处理(Pre-processing)是在视频解码之前对视频流进行的处理步骤。前处理通常是为了准备视频数据以供解码器解码,或者为了提高解码过程的效率和质量。以下是一些常见的前处理步骤:
-
数据接收和缓冲:解码器首先接收压缩的视频数据,并将其存储在内部缓冲区中。这个缓冲过程有助于确保解码器在处理数据时能够稳定、连续地工作,避免因数据不连续或丢失而导致解码失败。
-
数据解封装(Demuxing):如果视频数据被封装在容器格式(如MP4、MKV、TS等)中,解码器需要先进行解封装操作,将视频流从容器中分离出来。这一步骤可能还包括提取视频流的元数据信息,如分辨率、帧率、编码格式等。
-
同步处理:对于带有音频和/或字幕的视频流,解码器需要进行同步处理,确保视频、音频和字幕之间的时间同步。这通常涉及到对时间戳的解析和调整,以确保它们在解码和播放时能够正确对齐。
-
解码参数设置:在解码之前,解码器可能需要设置一些解码参数,如解码模式(如硬件解码或软件解码)、解码分辨率、帧率等。这些参数的设置会影响解码器的性能和输出质量。
-
数据预处理:在某些情况下,解码器可能需要对输入数据进行一些预处理操作,以便更好地进行解码。例如,对于某些特定的编码格式或压缩算法,解码器可能需要先对数据进行解码或解压缩,以将其转换为更适合解码的格式。
需要注意的是,前处理的具体步骤和参数可能因解码器的实现和配置而有所不同。此外,前处理过程可能也会受到输入视频流的特性(如编码格式、分辨率、帧率等)和解码器的性能限制的影响。
重建帧
在视频编码和解码过程中,参考帧(Reference Frame)是用于预测当前帧内容的先前帧或后续帧。它们被用于减少冗余信息,提高编码效率。在某些情况下,如解码器缓冲区不足或网络传输延迟,参考帧可能无法及时到达解码器,这时就需要使用某种方法来重建这些参考帧。
解码器重建帧的过程通常涉及从压缩的视频数据中提取和解码帧。这个过程可能包括以下步骤:
- 提取和解码参数:首先,解码器需要从比特流中提取解码参数。这些参数可能包括帧类型(如I帧、P帧、B帧等)、运动矢量、量化参数等。
- 解码帧数据:接下来,解码器使用提取出的参数来解码帧数据。这通常涉及对压缩的帧数据进行逆量化(Inverse Quantization)和逆变换(Inverse Transform),以恢复出原始的像素数据。
- 参考帧管理:在解码过程中,解码器需要管理参考帧。参考帧是用于预测当前帧的先前帧或后续帧。解码器需要确保正确的参考帧在解码时被使用,并在必要时对参考帧进行重建或更新。
- 帧重建:在某些情况下,如参考帧丢失或损坏,解码器可能需要重建参考帧。这可以通过使用其他已解码的帧进行插值、预测或使用特定的帧重建算法来完成。
- 后处理:最后,解码器可能需要对解码后的帧进行后处理,如去块滤波(Deblocking Filter)、环路滤波(Loop Filter)等,以提高图像质量。
需要注意的是,解码器重建帧的效果会受到多种因素的影响,如编码算法、比特率、帧率、图像分辨率等。此外,解码器的性能和实现方式也会对重建帧的质量产生影响
level
H.264是一种广泛使用的视频编码标准,用于压缩和传输数字视频。在H.264标准中,“Level”是指一个特定的性能级别,它定义了编解码器在特定条件下能够处理的视频流的复杂性和要求。Level与比特率、分辨率、帧率和其他参数有关,用于确保编解码器在不同设备和网络条件下的互操作性和兼容性。
在H.264中,Level 4.0和Level 5.1是两种不同的性能级别。一般来说,较高的级别(如Level 5.1)支持更高的比特率、更高的分辨率和更高的帧率,但也需要更多的计算资源来处理。相比之下,较低的级别(如Level 4.0)则适用于资源有限的设备或网络条件较差的环境。
具体来说,Level 4.0通常支持以下参数范围:
- 比特率:最高可达10 Mbps
- 分辨率:最高可达1920x1080像素(1080p)
- 帧率:最高可达30帧/秒
而Level 5.1则支持更高的参数范围:
- 比特率:最高可达50 Mbps
- 分辨率:更高,具体取决于比特率和帧率
- 帧率:最高可达60帧/秒
需要注意的是,这些参数范围只是大致的指导值,实际的参数可能会因具体的编解码器实现和配置而有所不同。此外,选择适当的Level还需要考虑其他因素,如设备性能、网络带宽和延迟等。
Profile
H.264中的Profile和Level是描述视频编码特性和解码器能力的两个重要参数。
Profile是对视频压缩特性的描述,它定义了编码器可以使用的工具集和编码技术的集合。不同的Profile代表了不同的编码复杂度和功能特性。例如,Baseline Profile主要支持实时视频通信,而High Profile则提供了最完善的支持和最优秀的特性,主要用于高清视频编码。Profile越高,说明采用了越高级的压缩特性。
Level则是对视频本身特性的描述,它与视频的码流、帧率、分辨率等参数相关。Level定义了解码器可以处理的最大码率、最大分辨率和帧率等。例如,Level 1.0定义了最低的视频特性,而Level 5.0则定义了更高的视频特性。Level越高,视频的码率、分辨率、帧率等参数也越高。
Profile和Level的关系是相互关联的。解码器需要同时支持相应的Profile和Level才能正确解码视频流。例如,如果一个视频流的Profile是High Profile,Level是4.0,那么解码器也必须支持High Profile和至少Level 4.0才能正确解码这个视频流。
DBRATE
DBRATE通常与视频编码和压缩相关,它代表的是编码后的数据比特率(Data Bit Rate)。比特率是衡量数据在单位时间内传输或处理的速率,对于视频而言,它通常表示每秒传输或存储的视频数据量。