首页 >> 百科

帧是什么意思(详细讲解视频和视频帧基础知识)

2022-09-01 百科 453 作者:admin

自 2018 年 12 月接手基于 x86 平台的边缘计算设备上的取流和解码工作到现在已经几个月了。作者还记得我对流媒体、视频、帧、图像等,我也慢慢跟着项目一步步学习,受益匪浅。将本文用作继续学习的里程碑!

本文将介绍:

视频基础知识。包括:视频协议和格式、视频流。

视频帧的基础知识。包括:YUV帧格式、常用帧名词(帧率fps、分辨率、比特率)、“奇怪”帧名词(1080p和1080i)、源自视频编解码器的帧名词(GOP、IBP帧)。

本文于 2019 年 4 月 8 日首次完成,包括:

视频协议、格式、播放原理等基本内容;

YUV格式、fps、分辨率、GOP、I/B/P帧等视频帧基本知识;

提到了 H264 等视频压缩技术。

2019年9月7日进行了第二次修改,修改如下:

第一章增加了视频流的介绍,删除了播放原理的介绍;

第2章增加了YUV采样和存储格式示意图,字段介绍,1080p和1080i;删除了YUV颜色范围(Color Range)的引入;

删除了原第三章的内容,后续文章会介绍。

相信大家对视频都不陌生,肯定会经常浏览各大视频网站(如腾讯视频、哔哩哔哩),甚至偶尔会在本地缓存视频并保存为.mkv、.avi文件等。前者是我们常说的“网络流媒体”,后者就是“本地视频文件”。这里有两个问题:

本地视频文件一般是MP4、MKV、AVI等,这些是什么?有什么区别?

在腾讯视频和哔哩哔哩上观看的视频与本地播放的MP4、MKV和AVI文件有什么区别?

在介绍第一个问题之前,我们必须先介绍一个术语“视频包格式”,简称“视频格式”,也称为“容器”。有些索赔还需要区分视频文件格式和视频包格式,本文统称为“视频包格式”。

问题一:本地视频文件一般是MP4、MKV、AVI等,这些是什么?有什么区别?

首先,MP4、AVI和MKV是本地视频文件的后缀。在系统下,它们用于提示操作系统应该使用哪个应用程序来打开它。在流媒体领域,这些被称为“视频封装格式”,因为除了音视频流之外,它们还包含一些辅助信息和组织视频和音频的方式。不同格式的视频在不同平台上有不同的用户体验,很大程度上是由于视频和音频的组织方式不同。笔者认为百度百科上的解释比较容易理解(维基的说法不够直白):

视频格式是视频播放软件为了播放视频文件而赋予视频文件的标识符号。

简而言之,视频格式指定了与播放器的通信协议。

其次,笔者打算开始深入研究MP4、AVI、MKV等的内部原理,主要是视频和音频的组织。比如在播放视频的时候,我们可以选择普通话、粤语、英语等语言,也就是说这个视频和音频包含了多个音频流。 【给自己留个坑。 ]

最后,作者推荐一个很好的博客:视频文件格式你知道多少,总结的很全。

问题一的延伸:对于想要做视音频处理的开发者,接触MP4、MKV、AVI等视音频文件有什么需要注意的吗?

视音频处理可以扩展到很多领域,包括解码、编码、滤波、增强处理等。笔者目前只在解码领域进行探索,答案是:对于解码,没有区别其他方面尚不清楚。

“视频封装格式”是对编码后的视频和音频进行“封装”,添加播放相关的协议数据(这是作者的感悟,表述不准确,欢迎批评指正)。目前主流的开源框架在“拆包”工作上都非常成熟。例如,它们提供用于打开视频和音频的 API。开发者可以直接提取视频和音频流进行处理,无需关注具体的视频格式。

接下来,我将介绍第二个问题。作者介绍了“视频协议”一词。也有说法称“视频协议”也属于“视频封装格式”。

问题2:在腾讯视频和哔哩哔哩上观看的视频与本地播放的MP4、MKV和AVI文件有什么区别?

“视频协议”适用于网络流媒体,即只有在有网络的情况下才能通过浏览器或手机APP观看的视频。目前常用的协议有RTSP、RTMP、HLS、HTTP等,笔者简单的接触了一下开发。连接RSTP视频时,发现除了视频和音频流外,还承载着播放的信令。

也有文章将“视频协议”归类为“视频封装格式”。在作者看来,这样的分类也是有道理的:“视频协议”和“视频封装格式”都承载了音频和视频,以及协议/格式所需的其他信息。例如,不区分视频格式和视频协议;但“视频协议”仍需指定,但不区分“视频封装格式”。

剥去“视频封装格式”和“视频协议”的外壳,进而了解视频和音频流本身,才是流媒体领域的真正主角。本文仅介绍视频流。

说到视频流,相信大家一定经常听到“h264流”、“yuv流”、“编码流”、“解码流”、“原始流”、“裸流”、“压缩流“后流”或“未压缩流”等。总结起来,说到“视频流”,肯定只有两种形式:

通过压缩算法压缩的流数据称为“编码流”,由于目前的压缩/编码算法主要是H264,所以也常被称为“H264码流”。

未压缩的流数据是解码后的流数据,称为“原始流”。可以想象,视频是由时间上连续的“图像”组成的,由于视频“图像”里面的“图像”是“YUV”(后面会介绍),所以也常被称为“YUV”流”。

总结出现的名称,“h264 流”、“编码流”、“压缩流”是压缩/编码的视频流;而“yuv流”、“解码流”、“未压缩流”“是未压缩/编码的视频流。“裸流”是一个模棱两可的词,上下文内容,可以是前者,也可以是后者。

因此,如果您以后阅读任何与流媒体相关的文章并看到“视频流”,您应该知道它是否经过编码/压缩。日常生活中,接触到的视频文件大部分都是经过编码/压缩的;在网络传输场景中,大部分也是经过编码/压缩的。只有在播放视频时,观看者才会看到解码后的视频流被逐帧“转码”成“RGB”。

编码/压缩是流媒体领域非常重要的技术:从“H264流”到“YUV流”的过程称为解码,反之称为编码。

在流媒体领域,“流”非常重要,“流”的基本元素“帧”同样重要。原因是:对于视频编码/压缩来说,其核心是用尽可能小的空间来存储一组时间上连续的帧数据;对于视频解码来说,就是将编码/压缩后的一组帧数据尽可能的存储起来,恢复到原来的状态。能100%恢复的编码/压缩算法称为无损压缩,反之称为有损压缩(虽然无损压缩是最理想的,但在很多实际场景中,为了追求高压缩比,例如在为了减少网络带宽压力,往往不得不选择有损压缩)。可见,“帧”是视频流领域的核心。接下来,我们来了解一下什么是“框架”。

“帧”可以和我们平时看到的“图片”相关联,但是我们平时接触到的图片都是“RGB”格式的,而视频帧通常是“YUV”格式的。既然提到了“RGB”和“YUV”,我们来了解下下一帧的“YUV”格式,这就引出了第一个问题:

问题3:为什么帧是“YUV”格式?什么是“YUV”?

为此,笔者花了很长时间了解色彩空间和电视成像等的发展历史,得出以下结论:

在达到最大压缩率的情况下,可以保证对人眼的失真最小。 “YUV”的三个通道中,“Y”代表亮度(nce或Luma),即灰度值;而“U”和“V”代表色度(或)。一堆科学家发现,人眼对紫外线最不敏感,所以可以大大压缩两个紫外线通道的数值。请参阅视频编解码器以了解 yuv 格式。

为了向前兼容黑白电视。这涉及历史原因。笔者强烈推荐零基础的入门级音视频开发。历史上,在制定视频帧格式时,有人提出使用RGB,而最终决定使用YUV的真正原因其实是这个(看图片使用YUV格式,为什么不用RGB?

接下来,我将解释什么是“YUV”。笔者认为“YUV”是一个广义的概念。在视频领域,提到“YUV”时,往往有以下含义:

色彩空间

“Y”表示亮度(,Luma),“U”和“V”分别表示色度(),密度()。这里表示的是色彩空间的基础,即类似于XYZ坐标系的色标表示参考,也就是说,每种颜色都可以用一个三维向量来表示。与之类似的还有RGB色彩空间、HSV色彩空间等。下图来自 YUV 颜色是如何工作的?

图1.YUV坐标轴图

随着通信行业的发展和实际应用的复杂性,“YUV”催生了一个大家族。视频领域的人一定听说过YCbCr,甚至还有YPbPr、YIQ等,有的已经被时代淘汰,有的还在使用。 “YUV”族出现的原因,完全是由于实际电路系统的差异,导致从“YUV”到“RGB”空间的过渡,实际对应的转换系数略有不同,所以各部门开始制定各种这样的规范,导致了我们现在看到的“YUV”这个大家族。

YCbCr专为数字电路设计; YPbPr 用于模拟电路。但是,现在是数字时代,所以模拟电路的 YPbPr 已经逐渐被淘汰,而 YCbCr 仍然发挥着作用。所以现在,YCbCr 有时被简单地称为/想到“YUV”。

2.采样率

读者可能听说过“”、“”、“”,在这里可能会疑惑:“YUV不是颜色空间吗?为什么后面是一串数字?”因为当你看到 YUV 后面跟着一串数字时,说到数字,“YUV”就不再是色彩空间的基本含义,而是指在原始“YUV 流”上采样。

过去,当流媒体刚刚兴起时,还没有 4G/5G。当时,为了减轻网络传输的带宽压力,人们做出了各种努力。除了编码/压缩之外,YUV 采样率也是其中之一。

444、422、420是对三种“YUV”(数字电路中简称为YCbCr)的采样,三位数字代表YUV的采样率(数字电路中为YCbCr,本段后同)分别为频道。所以可以理解为444是全采样;和 422 分别是 Y 的全采样和 UV 的 1/2 均匀采样。有趣的问题,420 是否完全丢弃了 V 通道/分量数据?答案是否定的。

首先,我们必须了解一个问题。一帧图像是由像素组成的矩形。例如,大小为 4x4 的图像由 16 个像素组成。在平时接触的“RGB”图像中,每个像素必须由至少三个通道的RGB组成(有些图像也有alpha分量),每个分量的值一般为[0, 255],即[ 2^0, 2^8],所以常说一个像素占3个字节(如果还有其他成分,比如RGBA,那就另当别论了)。 “YUV”图像也是一样,它的每个像素都是由YUV组成的。

接下来,从整个图像宏观考虑采样问题。以4X4图像为例,444如下图2-1所示。这是它被可视化为图像时的样子,但它实际上并没有存储在机器中。详情请参考博客“探索图像的原始格式”。 422和420分别如图2-2和2-3所示。

图2-1.采样图

图2-1对应的是采样,即全采样。从图中可以看出,每个像素中的YUV通道都被保留了下来。一般来说,它太大了,所以很少使用。

图2-2.采样图

图 2-2 对应于采样。这种采样方式是:每条扫描线或每一行有两个相邻的像素,并且只取一个像素的UV分量。另外,可以计算出每个像素所占的大小是原来大小的2/3,所以说是大小的2/3。

这个时候,问题就来了。当“YUV”转换为“RGB”时,如果去除了UV成分的像素怎么办?方法很简单,就是相邻两个像素的Y分量共享保留的UV分量。

图2-2.采样图

图 2-3 对应于采样。这种采样方式是:隔行对每一行进行采样的方式,即从相邻的2个像素中只取1个像素的UV分量;在下一行中丢弃所有 UV 分量。另外,可以计算出每个像素所占的大小是原来大小的1/2,所以说是大小的1/2。恢复UV分量的方法是一样的,只是2X2矩阵共享剩余的UV分量。

这种设计手法真是别出心裁!如前所述,“人眼对UV最不敏感,因此可以大大压缩两个UV通道的数值”,而对于图像来说,相邻区域像素的颜色和饱和度一般都非常接近,所以以2X2矩阵为基本单位,只保留一组UV分量是合理的。

3.编码/存储格式

你一定听说过 YV12、YU12、NV12、NV21。不知道你看到这里:“后面的数字怎么变成了2?而且前面的英文字母也变了?”

以上统称为“视频存储格式”,即计算机如何存储一帧视频。

首先,“视频存储格式”一般分为“打包格式()”和“平面格式()”两大类。前者也称为“紧凑格式()”。其实还有“半平面模式(Semi-)”,估计用的比较少,所以很多文章经常忽略。

作者很感兴趣,为什么会有“打包格式”和“平面格式”两派,网上查了很多资料都找不到原因。博客【音视频基础】:I420、YV12、NV12、NV21等常见存储格式提到需要约定存储格式,但没有提到为什么要分分为这两种。要么是派系主义,类似于贝叶斯学派和常客学派,要么是两种格式逐渐从实际应用中衍生出来的。如今,这两种格式仍在使用中,因此多媒体开发人员有必要了解一下。

“打包格式”横向存储YUV分量,“平面格式”严格分开存储YUV,“半平面模式”介于两者之间,Y分量单独存储,UV横向存储。

下图是一个例子,说明“封装格式”、“平面格式”和“半平面模式”应该很清楚。图片取自博客YUV格式初步研究:

图3-1.存储示意图

图3-2.存储示意图

图3-3.存储示意图

但是关于上图中的“包装格式”,笔者有些疑惑。大部分说法都是“YUV通道交叉存储,相邻像素尽量打包在一起”,图3-3中的U1后面是It's U2而不是V1,YUV好像没有完全排成一个交叉方式?笔者尝试在网上搜索更多关于“打包格式”的例子,但没有找到特别好的资料,[这里给自己挖个坑]。

接下来,让我们继续讨论一些与框架相关的概念。

普通框架名词

帧速率 (FPS)

“帧率”,FPS,全称 Per。指每秒传输的帧数,或每秒显示的帧数。一般来说,“帧率”影响画面的流畅度,成正比:帧率越高,画面越流畅;帧率越小,画面越好。悸动。更权威的说法:

当视频帧率不低于24fps时,人眼会感觉到视频连贯,称为“视觉暂留”现象。

因此有一种说法:虽然“帧率”越高越流畅,但在很多实际应用场景中,24fps就足够了。

分辨率()

“分辨率”通常也称为“图像大小”或“图像大小”。指一帧图像中包含的像素数。常见的有(720P)、(1080P)等规格。 “分辨率”影响图像大小,并与其成正比:“分辨率”越高,图像越大;否则,图像越小。

比特率 (BPS)

“比特率”,BPS,全称Bits Per。指每秒传输的数据位数,常用单位为KBPS(千比特每秒)和MBPS(兆比特每秒)。作者认为这个概念还是需要好好解释的。网上有人说:“‘码率’与体积成正比:码率越大,体积越大;码率越小,体积越小”;另一个说:“‘码率’越大,单位时间的采样率越大,数据流精度越高,这样做的效果是:视频画面更清晰,质量更高”;还有一种说法:“”“比特率”就是“失真”。但作者一时间没看懂。每秒传输的数据越大,为什么对应的画面一定要更清晰?以及如何理解音量?请参阅下面的“三者之间的关系”。

“帧率”、“分辨率”和“比特率”的关系

理想的情况是画面越清晰流畅。但在实际应用中,还需要结合硬件的处理能力和实际带宽条件进行选择。高“帧率”和高“分辨率”意味着高“码率”,也意味着编码、解码和图像处理都需要高带宽和强大的硬件能力。所以“帧率”和“分辨率”应该视情况而定。

要说三者的关系,其实就是对“码率”的理解。在比特率(BPS)的概念上,我从网上提到了几段,太模糊了。直到我阅读文章 Video Vs. 之前,我才真正理解“比特率”。帧速率。

首先,这些说法没有说明一个前提:“帧率”、“分辨率”和“压缩率”都会影响“比特率”。视频与。帧率](

) 文章一开始就明确指出:

作为 , , 帧率的更多, 并降低到 .

“比特率”是一个更广泛的(视频)质量指标:更高的“分辨率”、更高的“帧率”和更低的“压缩率”都会导致“比特率”的提高。

“分辨率”和“压缩率”对“码率”的影响在文章后面会强调:高分辨率意味着图片可以包含更多细节,低压缩率意味着图像压缩损失更少,也就是失真越小越清晰。那么为什么不专门讨论“帧率”呢?笔者认为有两个原因:一是“帧率”的影响非常直观,每秒帧数的增加必然会导致数据量的增加;另一个是“帧率”在实际应用场景中是比较固定的,一般我们看的视频都在25-30fps之间,有些高帧视频现在是60fps,可见视频“帧率” "在实际场景中很少讨论。

奇怪的框架名词:1080p 和 1080i,field

我只是因为觉得有趣才放上来。 1080p、1080i 和场是相对“旧”的概念。在 CRT 电视时代,显示屏是用电子枪逐行扫描屏幕产生的。一幅完整的图像,这叫做“场”,后来这个词不常用了,取而代之的是“帧”。 【技术在进步,过时的概念和应用都会被新的取代,所以我们真的需要不断学习,与时俱进! ]

1080p和1080i也是“场”同一时期的概念:

${}i的字母“i”代表隔行扫描,例如奇数“场”只扫描奇数行,下一个“场”表示偶数“场”只扫描偶数行-编号的行。这在过去非常有用,在网络条件较差、带宽有限的情况下,隔行扫描可以大大减少传输的数据,而不会影响观看者的观看体验。

${}p 的字母“p”表示逐行扫描,即一个“场”完整扫描整张图片。这是后来提出的一个概念,也代表了时代的进步,带宽条件已经来了。

既然是老概念,何必再提?借用1080P和1080i的文章是什么意思?第一段:

在液晶时代,交错和逐行已经没有多大意义了。现在的电视和显示器都是固定像素的设备,像素是同时发光的,所以不需要扫描,但是如果你坚持的话,可以我认为现在的显示设备都是逐行扫描的,但确实如此不代表1080P和1080i可以淘汰。毕竟相机的画幅也有关系,不过普通观众不会在意用什么相机拍的,只在乎好看就好了。

视频“帧”与编解码密切相关,因此与视频编解码相关的“帧”概念有很多。

源自视频编解码器的帧名词

I帧、P帧、B帧和IDR帧

任何接触过小视频编解码器的人一定见过 IPB 帧,至于 IDR,他们可能见过的更少。下面,对每种类型进行简要说明:

I帧,英文全写Intra,又称帧内编码帧,俗称关键帧。一般来说,I帧不需要依赖前后帧的信息,可以独立解码。有资料显示,仅I帧的压缩率就可以达到7。实际上,I帧的压缩可以相当于单独压缩一张图片。至于I帧的压缩,只是压缩了空间上的冗余信息,后续编码相关的系列文章会详细介绍。 【这里再挖一个坑,免得你忘记了】

P帧,英文full-write-frame,又称前向预测编码帧,也有帧间预测编码帧。顾名思义,P帧需要依赖之前的I帧或P帧进行编码和解码,因为一般来说,P帧存储的是当前帧和前一帧(前一帧可能是一个I帧或一个P 帧)。区别,更专业地说,是压缩时间冗余信息,或者提取运动特征。 P帧的压缩比在20左右,几乎所有的H264编码流都有大量的P帧。

B帧,全英文bi-on frame,又称双向预测插值编码帧,简称双向预测编码帧。 B架很特别。它存储当前帧和前一帧之间的差异。所以B帧视频的解码逻辑会更复杂,CPU开销也会更大。因此,并不是所有的视频都有B帧,我还没有接触过带B帧的视频。 【如果发现有B帧的视频,一定要好好珍惜,好好学习! ] 但是B帧的压缩率可以达到50甚至更高,这在压缩率指标上还是很客观的。

IDR帧,英文写的,翻译为即时解码刷新。听起来这种框架不是名词概念,而是动词? IDR帧是一种特殊的I帧,是为编解码器服务而提出的概念。 IDR帧的作用是立即刷新,这样错误就不会传播。从IDR帧开始,重新计算一个新的序列开始编码(摘自博客H264中I帧和IDR帧的区别)。

I/P/B 帧不根据视频帧数据内元素的差异进行区分。从解码帧本身来看,它们没有区别。只是编码时帧的处理方式不同。

共和党

英文全称Group Of,一般来说是指两个I帧之间的间隔,严格来说是两个IDR帧之间的间隔。作者对GOP的研究不多。关于网上的说法:“GOP会在一定程度上影响视频画质——在相同码率的情况下,GOP越大,PB帧越多,越容易获得更高质量的图像。好图像质量”是有问题的。 【这里留个坑补上】

PTS、DTS

我在硬解码视频文件时,发现实际解码输出的fps是硬解码能力的上限。例如,一个24fps的视频文件通过硬件解码可以达到100。那时,我收到了一个请求。是:“需要控制视频文件的解码率,使其与文件的fps保持一致”。后来查阅了很多资料,才明白了DTS和PTS的概念:

DTS,英文全称Time Stamp,是解码时间戳。这个时间戳的意思是告诉解码器什么时候解码这一帧的数据。

PTS,英文全称Time Stamp,是显示时间戳,用来告诉玩家什么时候显示这一帧的数据。

这个概念在做视频和音频同步时尤其重要,尤其是 PTS。目前常见的音视频同步三种策略:“同步到音频PTS”、“同步到视频PTS”和“同步到系统/外部时钟”,均基于PTS。

虽然每个概念在网上都可以查到很多资料,但笔者出身于多媒体开发新手,觉得最好对系统有一个全面的介绍。本文每一个地方都是基于作者自己的理解,而不是简单的从网上“复制粘贴”。希望对大家有帮助!当然,如果文章中有任何不准确之处,请留言让我们知道;或者如果您有任何有趣的话题可以讨论,也欢迎您留言!

关于我们

最火推荐

小编推荐

联系我们


Copyright 8S新商盟 Rights Reserved.
联系YY号:2949821684
邮箱:chenjing919994@sohu.com
备案号:浙ICP备2023016511号-1