【H264】常见名词

编码格式

未经压缩的音视频原始数据是很大的,编码的目的即压缩数据量。比较常见的编码格式有 MPEG(MPEG-2, MPEG-4)、H.26X(H.263, H.264/AVC, H.264/HEVC)。


封装格式

我们经常见到的 mp4、avi、flv、mkv、rmvb 等后缀的媒体文件,指的是文件的封装格式。是将已经编码压缩好的视频,音频,字幕等按照一定的格式放到一个文件。


帧与场

帧:当采样视频信号时,如果是通过逐行扫描,那么得到的信号就是一帧图像,通常帧频为 25 帧每秒(PAL 制)、30 帧每秒(NTSC 制);

场:当采样视频信号时,如果是通过隔行扫描(奇、偶数行),那么一帧图像就被分成了两场,通常场频为50Hz(PAL制)、60Hz(NTSC制);(偶数行成为顶场行。奇数行成为底场行)

帧频、场频的由来:最早由于抗干扰和滤波技术的限制,电视图像的场频通常与电网频率(交流电)相一致,于是根据各地交流电频率不同就有了欧洲和中国等 PAL 制的 50Hz 和北美等 NTSC 制的 60Hz,但是现在并没有这样的限制了,帧频可以和场频一样,或者场频可以更高。

帧编码、场编码方式:逐行视频帧内邻近行空间相关性较强,因此当活动量非常小或者静止的图像比较适宜采用帧编码方式;而场内相邻行之间的时间相关性较强,对运动量较大的运动图像则适宜采用场编码方式。


帧率 (frame rate)

是以帧称为单位的位图图像连续出现在显示器上的频率。fps(frames per second)是指每秒钟显示的帧数。更多详情请看百度百科 - 帧率


视频码率

单位时间传送的数据位数,一般我们用的单位是 kbps 即千位每秒。这个主要是播放网络流需要关注的概念。码率有两点原则:

  • 码率和质量成正比,但是文件体积也和码率成正比。
  • 码率超过一定数值,对图像的质量没有多大影响。

分辨率

分辨率是是指显示器所能显示的像素数量。显示分辨率一定的情况下,显示屏越小图像越清晰,反之,显示屏大小固定时,显示分辨率越高图像越清晰。


帧率,码率,分辨率关系

帧率影响的是显示流畅度,码率影响的是文件的传输速度,分辨率影响的是一帧图片的清晰度。

  • 在分辨率一定的条件下, 帧率越高需要的码率也越高,反之帧率越小需要的码率也小
  • 在码率一定的条件下, 帧率需求越高分辨率越小
  • 在帧率一定的条件下, 码率越高能传输的图像分辨率也越高

好的画质是分辨率、帧率和码率三者之间的平衡。在视频播放时,如果因为处理器处理速度慢处理不过来的情况,可以考虑先降码率,不过分辨率和帧率一定的情况下码率不能低于某一个值,码率无法再降时可考虑降分辨率和帧率。


I帧,B帧和P帧

经过压缩后的帧分为:I帧,B帧和P帧:

  • I帧:帧内编码帧(intra picture),通常是每个 GOP 的第一个帧,经过适度地压缩,做为随机访问的参考点,可以当成图象。I 帧可以看成是一个图像经过压缩后的产物,又称为关键帧。
  • B帧:双向预测帧(bi-directional interpolated prediction frame),既考虑与源图像序列前面已编码帧,也顾及源图像序列后面已编码帧之间的时间冗余信息来压缩传输数据量的编码图像,也叫双向预测帧。
  • P帧:前向预测编码帧(predictive-frame),通过充分将低于图像序列中前面已编码帧的时间冗余信息来压缩传输数据量的编码图像,也叫预测帧。

I、B、P 帧的区别:

  • I 帧:自身可以通过视频解压算法解压成一张单独的完整的图片。
  • B 帧:则要参考其前一个 I 或者 P 帧及其后面的一个 P 帧来生成一张完整的图片。
  • P 帧:需要参考其前面的一个 I 帧或者 B 帧来生成一张完整的图片。

序列(GOP)

序列(GOP)就是多张内容差异不太大的图像编码后生成的一串数据流,以 I 帧开始,到下一个 I 帧结束。

  • 当运动变化比较少时,一个序列可以很长,因为运动变化少就代表图像画面的内容变动很小,所以就可以编一个 I 帧,然后一直 P 帧、B 帧了。
  • 当运动变化多时,可能一个序列就比较短了,比如就包含一个 I 帧和 3、4 个 P 帧。

H264_Noun_C.png

Tip:对目前比较流行的直播和短视频来说,短视频的数据 I 帧会比较少,因为 I 帧数据比较大。而直播的话 I 帧比较多,因为客户端需要一进入直播间就能马上播放,一般是 2s 左右一个 I 帧。


IDR

IDR(立即刷新图像)是第一个 I 帧。所以 IDR 一定是 I 帧,但是 I 帧不一定是 IDR 帧。只有 IDR 帧,才有 SPS 和 PPS。

在编码和解码中为了方便,要把第一个 I 帧和其他 I 帧区别开,所以才把第一个 I 帧叫 IDR,这样就方便控制编码和解码流程。IDR 帧的作用是立刻刷新,使错误不致传播,从 IDR 帧开始,重新算一个新的序列开始编码。IDR 会导致 DPB(Decoded Picture Buffer,参考帧列表)清空,而 I 帧不会。

对于 IDR 帧来说,在 IDR 帧之后的所有帧都不能引用任何 IDR 帧之前的帧的内容,与此相反,对于普通的 I 帧来说,位于其之后的 B 和 P 帧可以引用位于普通 I 帧之前的 I帧。从随机存取的视频流中,播放器永远可以从一个 IDR 帧开始播放,因为在它之后没有任何帧引用之前的帧。但是,不能在一个没有 IDR 帧的视频中从任意点开始播放,因为后面的帧总是会引用前面的帧。


DTS/PTS

H264 里有两种时间戳:DTS(Decoding Time Stamp)和 PTS(Presentation Time Stamp)。 顾名思义,前者是解码的时间戳,后者是显示的时间戳。要仔细理解这两个概念,需要先了解 FFmpeg 中的 packet 和 frame 的概念。

FFmpeg 中用 AVPacket 结构体来描述解码前或编码后的压缩包,用 AVFrame 结构体来描述解码后或编码前的信号帧。 对于视频来说,AVFrame 就是视频的一帧图像。这帧图像什么时候显示给用户,就取决于它的 PTS。

DTS 是 AVPacket 里的一个成员,表示这个压缩包应该什么时候被解码。 如果视频里各帧的编码是按输入顺序(也就是显示顺序)依次进行的,那么解码和显示时间应该是一致的。可事实上,在大多数编解码标准(如 H.264 或HEVC)中,编码顺序和输入顺序并不一致。 于是才会需要 PTS 和 DTS 这两种不同的时间戳。


DTS和PTS的不同:

DTS 主要用于视频的解码,在解码阶段使用。PTS 主要用于视频的同步和输出,在display的时候使用。

下面给出一个 GOP 为 15 的例子,其解码的参照 frame 及其解码的顺序都在里面:

H264_Noun_A.jpg


如上图所示,I 帧的解码不依赖于任何的其它的帧。而 P 帧的解码则依赖于其前面的 I 帧或者 P 帧。B 帧的解码则依赖于其前的最近的一个 I 帧或者 P 帧及其后的最近的一个 P 帧。

可以看出:对于普通的无 B 帧视频(H264 Baseline 或者 VP8),PTS/DTS 应该是相等的,因为没有延迟编码。对于有 B 帧的视频,I 帧的 PTS 依然等于 DTS,P 帧的 PTS>DTS, B 帧的 PTS<DTS。

可以简单地这样理解:

若视频没有 B 帧,则 I 和 P 都是解码后即刻显示。

若视频含有 B 帧,则I是解码后即刻显示,P 是先解码后显示,B 是后解码先显示。(B 和 P 的先、后是相对的)。


参考:

《新一代视频压缩编码标准》

播放器基础 -- 名词介绍

从零了解H264结构

H264系列(9):H264中的时间戳(DTS和PTS)


原文地址:https://www.cnblogs.com/linuxAndMcu/p/14533261.html