视频和视频帧:视频和帧基础知识整理
基于18年12月的接手x86平台边缘计算设备的流量解码已经工作了几个月。作者还记得对流媒体、视频、帧、图像等概念完全混乱,慢慢跟随项目一步一步地学习,受益匪浅,以本文鼓舞人心作为继续学习的里程碑!
本文将介绍:
视频的基本知识。包括:视频协议、格式、视频流。视频帧的基本知识。YUV帧格式,常见帧名词(帧率)fps、帧名词(1080p和1080i)、帧名词源自视频编解码(GOP、IBP帧)。修改记录本文于2019年4月8日首次完成,包括:
视频协议、格式、播放原理等基本内容;YUV格式、fps、分辨率、GOP和I/B/P帧等视频帧的基本知识;提到H2 ** 等视频压缩技术。二次修改于2019年9月7日进行,修改内容如下:
第一章增加了视频流介绍,删除了播放原理介绍;第二章增加了YUV现场、1080p和1080i介绍;删除YUV的颜色值域(Color Range)介绍;删除了原第三章的内容,这篇文章将在后续发表。I. 视频基础知识我相信每个人都必须熟悉视频。通常,他们必须经常浏览主要视频网站(如腾讯视频和比利比利),甚至偶尔将视频缓存到本地并保存.mkv,.avi文件等等。前者是我们常说的『网络流媒体』,后者是『本地视频文件』。两个问题来了:
常见的本地视频文件MP4、MKV、 ** I等等,这些是什么?有什么区别?腾讯视频和哔哩哔哩在线观看的视频与当地播放的视频有什么不同?MP4、MKV、 ** I文件有什么区别?在介绍第一个问题之前,必须引入一个名词『视频包装格式』,简称『视频格式』,也称为『容器』。有的说法还要区分是视频文件格式和视频包装格式,本文统一称『视频包装格式』。
视频格式问题1:常见的本地视频文件MP4、MKV、 ** I等等,这些是什么?有什么区别?
首先,MP4、 ** I、MKV都是本地视频文件的后缀,在windows用于提示操作系统应使用哪个应用程序打开系统。在流媒体领域,这些都被称为『视频包装格式』,除音视频流外,它们还包含了一些辅助信息和组织视频音频的方法。不同格式的视频在不同的平台上有不同的用户体验,主要是因为视频的组织方式不同。作者认为百度百科全书上的解释很容易理解( ** 说法不够直白):
视频格式是视频播放软件为了播放视频文件而赋予视频文件的识别符号。简而言之,视频格式规定了与播放器的通信协议。
其次,作者最近准备开始深入研究MP4、 ** I、MKV内部原部原则主要是组织视频和音频的方式。例如,在播放视频时,我们可以选择各种语言,如普通话、广东话和英语,这意味着视频和音频包含多个音频流。给自己留个坑。
最后,作者推荐了一个很棒的博客:视频文件格式知道多少,总结得很完整。
问题1引申:对于想做视频处理的开发者,接触MP4、MKV、 ** I在等待各种格式的视频文件时,有什么需要注意的吗?
视频和音频处理可以多领域,包括解码、编码、过滤、增强处理等。作者目前只探索解码领域,答案是:解码没有区别。其他领域还不清楚。
『视频包装格式』,它是在编码视频和音频的基础上进行包装,添加与播放相关的协议数据(这是作者的认知,如果表达不准确,欢迎批评和纠正)。目前,主流开源框架在解包装工作中非常成熟FFMpeg,为打开视频音频提供了API,开发人员可以直接取出视频流进行处理,无需注意具体的视频格式。
接下来,我将介绍第二个问题,作者将引入名词『视频协议』,也有说法认为『视频协议』也属于『视频包装格式』。
视频协议问题2:在腾讯视频、哔哩哔哩网上观看的视频,以及当地播放的视频MP4、MKV、 ** I文件有什么区别?
『视频协议』它是针对网络流媒体的,即只有在有网络时才能通过浏览器或移动终端APP目前常见的协议有视频RTSP、RTMP、HLS、HTTP等等。作者短暂接触过。GStreamer开发,连接RSTP在视频中,除了视频流和音频流metadata此外,还携带播放信令。
也会有文章『视频协议』归入『视频包装格式』。在我看来,这种分类也有其原因:『视频协议』和『视频包装格式』同时携带视频和音频metadata,以及协议/格式所需的其他信息。以FFMpeg例如,视频格式和视频协议没有区别;但是GStreamer还需要指定『视频协议』,但是不区分『视频包装格式』。
剥开『视频包装格式』和『视频协议』外壳,接下来了解视频流本身,这才是流媒体领域真正的主角。本文仅介绍视频流。
视频流就视频流而言,我相信你一定经常听到类似的h2 ** 码流”、“yuv流、编码流、解码流、原始流、裸流、压缩流或未压缩流等。综上所述,提到『视频流』一定只有两种形式:
压缩算法压缩的流数据称为『编码流』,由于目前的压缩/编码算法H2 ** 因此,它也常被称为『H2 ** 码流』。未压缩流数据是解码流数据,称为『原始流』,可以想象,视频是由时间上连续的图像组成的,因为视频中的图像是『YUV』(后面介绍),所以常被称为『YUV流』。总结出现的名称,h2 ** 编码流、编码流、压缩流是压缩/编码后的视频流;而yuv流、解码流、未压缩流是未压缩/编码的视频流。裸流是一个歧义性的词,可以是前者或后者。
因此,如果你将来阅读任何与流媒体相关的文章,你会看到它『视频流』应该弄清楚这是编码/压缩还是不。在生活中,接触到的大部分视频文件都是编码/压缩的;在网络传输场景中,大部分也是编码/压缩压缩后的。只有在视频播放时,观众才能看到一帧帧『转码』为『RGB』视频流解码后。
流媒体领域的编码/压缩是一项非常重要的技术:从『H2 ** 码流』到『YUV流』过程称为解码,反之亦然。
II. 帧流媒体领域,『流』很重要,『流』的基本元素『帧』同样重要。原因是:对于视频编码/压缩,其核心是在尽可能小的空间内存储一组时间连续帧数据;对于视频解码,将编码/压缩的帧数据恢复到原始状态。可100%恢复的编码/压缩算法称为无损压缩,反之亦然(无损压缩虽然是最理想的,但在很多实际场景中,为了追求高压缩率,比如降低网络带宽压力,往往要选择有损压缩)。由此可见,『帧』是视频流媒体领域的核心。接下来,让我们知道什么是『帧』。
『帧』,可以联想成我们平时看到的图像,但我们平时接触的图片是『RGB』格式,视频帧通常是『YUV』格式。既然提到了『RGB』和『YUV』,然后了解下帧的格式『YUV』,第一个问题:
问题3:为什么帧使用『YUV』格式?『YUV』是什么?
为此,笔者花了很长时间了解色彩空间、电视成像的发展历史等,整理结论如下:
在达到最大压缩率的情况下,可以保证对人眼感知的失真度最小。『YUV』三通道,其中"Y";表示亮度(Lumina nce或Lu ** ),也就是灰阶值;和"U"和"V";表示色度(Chrominance或Chro ** )。许多科学家发现,人眼对面UV敏感度最低,可以大比例压缩UV两个通道的值。见视频编解码学习一 yuv格式。向前兼容黑白电视。这涉及历史原因。作者强烈推荐零基础入门音视频开发。在历史上,有人提出使用视频帧格式RGB是的,最后决定用YUV这是真正的原因(见图像使用)YUV为什么不使用格式?RGB呢?。接下来解释『YUV』作者认为是什么,『YUV』在视频领域,提到它是一个广义的概念『YUV』通常有以下含义:
颜色空间“Y表示亮度(Luminance、Lu ** ),“U”和“V”则是色度(Chrominance)、浓度(Chro ** )。这是色彩空间的基础,类似XYZ坐标系的色标表示基准,即每种颜色都可以通过三维向量<y^i^,u^i^,v^i^>来表示。还有类似的RGB颜色空间、HSV色彩空间等。下图来自How does the YUV color coding work?
图1. YUV坐标轴示意图随着通信行业的发展,实际应用的复杂性导致『YUV』一个大家庭衍生出来。一定听说过接触视频领域。YCbCr,甚至还有YPbPr、YIQ等。有的被时代淘汰,有的还在用。之所以出现『YUV』大家实际电路系统实际电路系统之间的差异『YUV』转到『RGB』空间,实际对应的转换系数有一些差异,所以各部门开始制定各种规范,我们现在看到『YUV』大家族。
YCbCr它诞生于数字电路;YPbPr它是模拟电路。然而,现在是数字时代,它诞生于模拟电路YPbPr已逐渐被淘汰,但已逐渐被淘汰YCbCr一直在发挥作用。所以现在,YCbCr有时它只是被称为/认为『YUV』。
2. 采样率
读者可能听说过读者可能听说过YUV444”,“YUV422”,“YUV在这里,你可能会想:420YUV不是颜色空间吗?为什么后面会跟着一串数字?” 因为当你看到的时候YUV后面跟着一串数字,『YUV』它不再是色彩空间的基本含义,而是在原始『YUV流』上的采样。以前流媒体刚兴起的时候,没有4G/5G,当时,为了减轻网络传输带宽的压力,我们做出了各种努力。除编码/压缩外,YUV采样率也是一种。444,422和420是三种『YUV』(指数字电路YCbCr)三位数分别代表采样YUV(在数字电路中YCbCr,本段后同)通道抽样比。所以可以理解,444是全采样;422是Y的全采样UV均匀采样1/2。有趣的问题来了,420是否完全丢弃了V通道/重量数据?答案是否定的。首先,我们必须理解一个问题。一帧图像是由像素组成的矩形,如4x图像的大小,由16个像素点组成。平时接触『RGB』在图像中,每个像素必须至少由RGB这三个通道(有些图像和alpha重量),每个重量的值一般是[0,255],即[2^0,2^8]所以常说像素占用3字节(如果还有其他重量,比如RGBA,另当别论)。『YUV』同样,它的每个像素都是由图像组成的YUV组成的。其次,从整个图像宏观上考虑采样问题。还是以4X以4的图像为例。444的图像如下图2-1所示。这是图像的形象。事实上,存储在机器中并非如此。详见博客《图像原始格式》。422和420分别如下图2-2和2-3所示。
图2-1. YUV444采样示意图图2-1对应YUV每个像素中都可以看到444采样,即全采样。YUV通道保留,一般来说YUV444太大了,很少用。
图2-2. YUV422采样示意图图2-2对应YUV422采样,采样方每条扫描线或每行相邻两个像素,只取一个像素UV重量。另外,可以计算出每个像素占用的大小是原来的2/3,所以YUV422是YUV444的2/3大小。
这个时候有个问题,『YUV』转『RGB』时间,被抽走了UV重量像素该怎么办?做法很简单,就是公共保留相邻两个像素的Y重量UV分量。
图2-2. YUV420采样示意图图2-3对应YUV420采样方采样方式为:隔行进行YUV每行422采样方法,即相邻两个像素只取一个像素UV重量;下一行丢弃一切UV分量。另外,可以计算出每个像素占用的大小是原来的1/2,所以YUV420是YUV444的1/2大小。恢复UV重量的方法相同YUV只是这里有2422X2.矩阵共享保留UV分量。
这种设计方法真的很巧妙!上面提到的"人眼对UV敏感度最低,可以大比例压缩UV两个通道的值";对图像而言,相邻区域像素的颜色和饱和度一般都很高接近,因此这种以2X2矩阵为基本单位,只保留1组UV分量合情合理。
3. 编码/存储格式
大家肯定还听说过YV12、YU12、NV12、NV21吧,看到这里是不是又纳闷:“后面的数字怎么变成2个了?而且前面的英文字母还变了?”以上统称为『视频的存储格式』,也就是说,计算机是如何存储一帧视频的。首先,『视频的存储格式』总分为两大类:『打包格式(packed)』和『平面格式(planar)』。前者又被称作『紧凑格式(packed)』。其实除此之外还有『半平面模式(Semi-Planar)』,估计是使用的比较少,因此在很多文章中常被忽略。笔者很感兴趣,为什么会出现『打包格式』和『平面格式』两大派系,网上搜了很多资料也没找到原因,博客【音视频基础】:I420、YV12、NV12、NV21等常见的YUV420存储格式提到了需要约定存储格式,但也没提到为什么会分成这两种。要么就是派系之争,类似贝叶斯学派和频率学派;要么就是实际应用中逐渐衍生出这两大格式。时至今日,这两个格式还在被使用,因此对于多媒体开发者们都有必要了解。『打包格式』是把YUV分量交叉存储,『平面格式』则是把YUV严格分开存储,『半平面模式』介于两者之间,Y分量分开存储,UV交叉存储。以下图为例说明『打包格式』、『平面格式』和『半平面模式』应该是非常清楚的,图摘自博客YUV格式初探:
图3-1. YUV420P存储示意图图3-2. YUV420SP存储示意图图3-3. YUV420Packet存储示意图但是关于上图的『打包格式』,笔者是是有一点疑惑的,大多数的说法是”YUV通道交叉存储,相邻的像素尽量打包在一起“,图3-3中U1后面跟着的是U2而不是V1,而且YUV的排列方式似乎也不完全是交叉?笔者尝试在网上搜索『打包格式』更多的例子,没有找到特别好的资料,【这里给自己挖一个坑吧】。
接下来,我们继续了解一些帧相关的概念。
常见的帧名词
帧率(FPS)『帧率』,FPS,全称Frames Per Second。指每秒传输的帧数,或者每秒显示的帧数,一般来说,『帧率』影响画面流畅度,且成正比:帧率越大,画面越流畅;帧率越小,画面越有跳动感。一个较权威的说法:当视频帧率不低于24fps时,人眼才会觉得视频时连贯的,称为“视觉暂留”现象。因此,才有说法:尽管『帧率』越高越流畅,但在很多实际应用场景中24fps就可以了。分辨率(Resolution)『分辨率』,也常被俗称为『图像的尺寸』或者『图像的大小』。指一帧图像包含的像素的多少,常见有1280x720(720P),1920X1080(1080P)等规格。『分辨率』影响图像大小,且与之成正比:『分辨率』越高,图像越大;反之,图像越小。码率(BPS)『码率』,BPS,全称Bits Per Second。指每秒传送的数据位数,常见单位KBPS(千位每秒)和MBPS(兆位每秒)。笔者认为这个概念真正要理解起来还是需要好好说明的,网上一说:“『码率』与体积成正比:码率越大,体积越大;码率越小,体积越小”;另一说:“『码率』越大,说明单位时间内取样率越大,数据流精度就越高,这样表现出来的的效果就是:视频画面更清晰画质更高”;还有说法是:”『码率』就是『失真度』“。但是笔者有一段时间就是不理解,每秒传输的数据越大,为什么必然就对应画面更清晰?还有体积怎么理解呢?且看下文”三者之间的关系“。『帧率』『分辨率』和『码率』三者之间的关系最理想的情况是画面越清晰、越流畅是最好的。但在实际应用中,还需要结合硬件的处理能力、实际带宽条件选择。高『帧率』高『分辨率』,也就意味着高『码率』,也意味着需要高带宽和强大的硬件能力进行编解码和图像处理。所以『帧率』和『分辨率』应该视情况而定。要说三者之间的关系,其实就是对于『码率』的理解。在码率(BPS)概念中提到了几段摘自网上的说法,说的都太模糊了,笔者直到阅读了文章Video Bitrate Vs. Frame Rate,才真的理解了『码率』。首先,这些说法都没有交代一个前提:『帧率』、『分辨率』和『压缩率』都会影响『码率』。Video Bitrate Vs. Frame Rate](https:// ** .www.platosclosethumble.com)文章在一开始就明确指出:
Bitrate serves as a more general indicator of quality, with higher resolutions, higher frame rates and lower compression all leading to an increased bitrate.『码率』是更广泛的(视频)质量指标:更高的『分辨率』,更高的『帧率』和更低的『压缩率』,都会导致『码率』增加。文章后面又特别强调『分辨率』和『压缩率』对『码率』的影响:高分辨率意味着图片可以包括更多的细节,低压缩率意味着图片压缩损失越少,即失真越少,越清晰。那为什么不特地讨论『帧率』呢?笔者认为原因有二:一个是『帧率』的影响非常直观,每秒帧数增加必然导致数据量增加;另一个是实际应用场景中『帧率』是相对固定的,我们观看的一般视频都在25-30fps之间,现在一些高帧视频是60fps,可见视频『帧率』在实际场景中被讨论的很少。
奇怪的帧名词:1080p和1080i、场
笔者仅仅出于觉得有趣才放上来的,1080p和1080i、场都是相对比较“老”的概念了,在还是CRT电视的时代,显示器显示画面都是靠电子枪一行一行扫描画面才能产生一副完整的图像,这就被称作『场』,后来这个名词也不常使用了,被取代它的是『帧』。【科技在进步,过时的概念、应用都会被新兴的替换,所以真的要不断学习紧跟时代啊!】
1080p和1080i也是『场』同一时期的概念:
${数字}i的字母”i“表示Interlace,代表隔行扫描,比如奇数『场』只扫描奇数行,后一『场』即偶数『场』只扫描偶数行。这在过去是非常有用的,当时网络条件差,带宽受限,隔行扫描可以很大程度上减少传输的数据,又不至于影响观众观看体验。${数字}p的字母”p“表示Progressive,即逐行扫描,也就是一『场』把全部画面扫描完整。这是后来才提出的概念,这也代表时代进步,带宽条件上来了。既然都是老概念了,那为什么还要再提呢?借用文章1080P和1080i是什么意思?的一段来说:
进入液晶时代的如今,隔行和逐行其实已经没有太大的意义了,现在的电视或者是显示器都属于固定像素设备,像素点同时发光,并不需要扫描,但是硬要说的话可以认为现在的显示设备都是逐行扫描的,但也并不是说1080P和1080i等就可以淘汰了,毕竟还涉及到摄像机的格式,不过普通观众也不会关心是用什么摄像机拍的,只关心呈现出来的样貌就好了。视频『帧』和编解码密切相关,因此还有不少『帧』的概念是和视频编解码相关的。
视频编解码而衍生的帧名词
I帧、P帧、B帧和IDR帧但凡接触过一点视频编解码的读者,一定见过IPB帧,至于IDR可能见的少一些。下面,简单解释每种类型:I帧,英文全写Intra Picture,又称帧内编码帧,俗称关键帧。一般来说I帧不需要依赖前后帧信息,可独立进行解码。有数据表明,仅I帧的压缩率,可以达到7,这里其实可以把I帧的压缩等同于单独压缩一幅图片。至于说I帧的压缩只压缩了空间上的冗余信息,放在后续编码相关的系列文章中会详述。【这里再挖一个坑,免得自己忘记了】P帧,英文全写predictive-frame,又称前向预测编码帧,也有帧间预测编码帧。顾名思义,P帧需要依赖前面的I帧或者P帧才能进行编解码,因为一般来说,P帧存储的是当前帧画面与前一帧(前一帧可能是I帧也可能是P帧)的差别,较专业的说法是压缩了时间冗余信息,或者说提取了运动特性。P帧的压缩率约在20左右,几乎所有的H2 ** 编码流都带有大量的P帧。B帧,英文全写bi-directional interpolatedprediction frame,又称 双向预测内插编码帧,简称双向预测编码帧。B帧非常特殊,它存储的是本帧与前后帧的差别,因此带有B帧的视频在解码时的逻辑会更复杂些,CPU开销会更大。因此,不是所有的视频都带有B帧,笔者目前还没有接触过带B帧的视频。【找到带B帧视频一定要珍藏起来好好研究!】不过,B帧的压缩率能够达到50甚至更高,在压缩率指标上还是很客观的。IDR帧,英文全写Instantaneous Decoding Refresh,翻译过来是即时解码刷新。听上去,这类帧并不是名词概念,倒像是个动词?IDR帧是一种特殊的I帧,它是为了服务于编解码而提出的概念,IDR帧的作用是立刻刷新,使错误不致传播,从IDR帧开始,重新算一个新的序列开始编码(摘自博客H2 ** 中I帧和IDR帧的区别)。I/P/B帧,并不是依据视频帧数据内部的元素的不同来区分的,从解码后的帧本身而言,它们没有任何区别。仅仅是在编码时,对帧处理的方式不同而已。
GOP英文全称Group Of Pictures,一般来说,指的就是两个I帧之间的间隔,严格来说,是两个IDR帧之间的间隔。笔者对GOP研究的不多,对于网上的说法:“GOP在一定程度上会影响视频画面质量 - 在码率相同的情况下,GOP越大,意味着PB帧越多,也就更容易获取较好的图像质量”这个说法存疑。【这里留个坑待填】PTS、DTS笔者是在对视频文件硬做解码的时候,发现实际解码输出的fps是硬解的能力上限,比如一个24fps的视频文件,在用硬件解码时,能够达到100+,当时接到一个需求是:“需要控制视频文件的解码率,让它和文件的fps保持一致”。后来查阅了大量的资料,进而了解了DTS和PTS的概念:DTS,英文全称Decoding Time Stamp,即解码时间戳,这个时间戳的意义在于告诉解码器该在什么时候解码这一帧的数据。PTS,英文全称Presentation Time Stamp,即显示时间戳,这个时间戳用来告诉播放器该在什么时候显示这一帧的数据。这个概念在做视音频同步的时候特别重要,尤其是PTS,目前常见的视音频同步的三种策略“同步到音频的PTS”、“同步到视频的PTS”和“同步到系统/外部时钟”,都是基于PTS完成的。
写在后面尽管每个概念网上都可以搜到一大堆的资料,但是笔者从一个多媒体开发小白走过来,觉得能有相对系统入门的综合性介绍就会更好了!本文每个地方,都是基于笔者自己的理解,而不是简单地从网上“ ** 粘贴”过来的,希望能够对大家有所帮助!当然,文章中有不严谨的地方,欢迎留言告知;或者有什么有趣的话题探讨,也欢迎私信留言!
最后,笔者目前在腾讯优图的边缘计算开发小团队,目前我们正在计划开源一款能够适配设备(以边缘设备为主)视觉AI计算落地应用框架-RapidAIoT,内容包括视频取流、AI计算、消息结果上报下发中间件。也欢迎大家咨询了解。
开云在线注册 承接各类微信小程序开发制作、小程序定制、APP 网站 开发制作,联系电话 18221533805、15900430334
直播运营计划方案
抖音的营销模式是什么?抖音的营销策略分析
【推荐】画画视频教程大全视频学画画教程视频教程!
如何截取综艺视频,制作短视频?
短视频APP源码开发的重点,视频录制和视频剪辑
视频号联盟:揭秘视频号与其他短视频平台的区别
视频搬运玩法,短视频怎么搬运?
对标西瓜视频推出下饭视频,腾讯All in短视频了?
【推荐】国画视频教程大全视频|如何自学国画教学视频
说说视频编码格式、视频码率、视频帧率、分辨率的概念
扫盲丨如何区分3D视频、360视频和VR视频?
视频切割怎么弄?视频剪辑软件可以切割视频吗?
视频后期怎么制作?视频剪辑软件可以制作视频后期吗?
一个视频分割成多个视频,视频分割工具哪个好?
视频营销时代来临|无锡视频拍摄
剪辑视频怎么调整方向,旋转视频?
视频剪辑必备神器,模糊视频变清晰视频的实例
短视频剧本 | 短视频剧本教学 | 短视频应该怎么定位?
视频剪辑制作 视频后期制作 视频制作 动画视频制作价格表
视频怎么优化?用它,快速优化视频!
联系我们