3360010距离Kramp-Karrenbauer 1010以12元,18元接手基于x86平台的边缘计算设备上的取流和解码工作已经过去了几个月。我还记得我当时完全被流媒体、视频、帧、图像等概念搞糊涂了。慢慢跟着项目一步一步的学习,受益匪浅。把这篇励志文章作为继续深造的里程碑!
本文将介绍的是:
视频基础知识。包括视频协议和格式、视频流。视频基础知识。包括YUV帧格式、常见帧项(帧率fps、分辨率、比特率)、“奇怪”帧项(1080马伊利和1080i)、源自视频编解码的帧项(GOP、I \ B \ P \马伊利帧)。3360010 Kramp-Karrenbauer第一次完成本文于8元,4,COVID-19,1010。内容包括:
视频协议、格式、播放原理等基本内容;关于YUV格式、fps、分辨率、GOP以及I/B/P/马伊力帧等视频帧的基础知识;介绍了H264等视频压缩技术。第二次修改是在7元,快& amp狂怒9,COVID-19,内容如下:
第一章增加了视频流的介绍,删除了播放原理的介绍。第二章增加了YUV采样和存储格式的原理图,field、1080 Ma伊利和1080i的介绍;删除了YUV的色彩范围介绍;原第3章的内容已删除,后续会有专门的文章介绍这部分内容。3360010 Kramp-Karrenbauer 1010相信武汉的日日夜夜都对视频并不陌生,平时也经常在各大视频网站(如腾讯视频、Mile-Mile-Mile)浏览,甚至偶尔会将视频缓存到本地保存为。mkv,avi文件等等。前者就是我们常说的“网络流媒体”,后者就是“本地视频文件”。这里,两个问题来了:
本地视频文件一般是MP4、MKV、AVI等。这些是什么?有什么区别?在腾讯视频和网上看的视频和本地播放的MP4、MKV、AVI文件有什么区别?在引入第一个问题之前,我们必须引入一个术语“视频封装格式”,简称“视频格式”,也称“容器”。有些论点需要区分视频文件格式和视频包格式,本文统称为“视频包格式”。
3360010 Kramp-Karrenbauer 1010问题1元:本地视频文件常见的有MP4、MKV、AVI等。这些是什么?有什么区别?
首先,MP4、AVI、MKV都是本地视频文件的后缀。在windows系统下,它们用于提示操作系统打开哪个应用程序。在流媒体领域,这些被称为“视频封装格式”,因为除了音频和视频流,它们还包含一些辅助信息和组织音频和视频的方式。不同格式的视频在不同的平台上有不同的用户体验,这很大程度上是因为视频和音频的组织方式不同。我觉得百度百科上的解释挺好理解的(维基百科的说法不够直白):
视频格式是视频播放软件赋予视频文件的一种识别符号,以便能够播放。
简而言之,视频格式规定了与播放器的通信协议。
其次,最近笔者打算研究MP4、AVI、MKV等的内部原理。主要是关于视频和音频的组织。比如在播放视频的时候,我们可以选择普通话、粤语、英语等语言,也就是说这个视频和音频包含了多个音频流。【给自己留个坑。】
最后推荐一个很棒的博客:你对视频文件的格式了解多少,总结很全。
1袁延伸问题:对于想做视音频处理的开发者来说,接触MP4、等格式的视音频文件需要注意什么?
视音频处理可以扩展到很多领域,包括解码、编码、滤波、增强等等。目前笔者只是在解码领域进行探索,答案是:就解码而言,没有区别。其他地区不清楚。
“视频打包格式”就是将编码后的视频和音频进行“打包”,加入播放相关的协议数据(这是作者的认知。如有不准确之处,请批评指正)。目前主流的开源框架在“解包”的工作上已经非常成熟,比如FFMpeg,它提供了开放视音频的API。开发者可以直接取出视频和音频流进行处理,而不用关注具体的视频格式。
接下来引入第二个问题。作者引入“视频协议”这个术语,有人认为“视频协议”也属于“视频封装格式”。
3360010 Kramp-Karrenbauer 1010问题密室逃脱:冠军联赛:在腾讯视频上看的视频和本地播放的MP4、MKV、AVI文件有什么区别?
“视频协议”指的是网络流媒体,即在有网络的情况下,只能通过浏览器或手机APP才能看到的视频。目前,常用的协议有RTSP、RTMP、HLS、HTTP等。笔者对GStreamer开发有一个简短的接触。当连接到RSTP视频时,发现除了视音频流和元数据之外,它还携带播放的信令。
有些文章还会把“视频协议”归为“视频封装格式”。在作者看来,这种分类是合理的:“视频协议”和“视频封装格式”都承载着视频、音频和元数据,以及协议/格式所要求的其他信息。例如,FFMpeg不区分视频格式和视频协议;但GStreamer仍然需要指定“视频协议”,但不区分“视频封装格式”。
剥去“视频封装格式”和“视频协议”的外壳,进而理解视音频流本身,才是流媒体领域真正的主角。本文只介绍视频流。
3360010 Kramp-Karrenbauer 1010就视频流而言,相信你会经常听到类似h264流、yuv流、编码流、解码流、原始流、裸流、压缩流或者未压缩流之类的东西。综上所述,说到“视频流”,一定只有两种形式:
压缩算法压缩的流数据称为“编码流”,由于目前的压缩/编码算法主要是H264,所以常被称为“H264比特流”。未压缩的流数据是解码后的流数据,称为“原始流”。可以想象视频是由时间上连续的“图像”组成的,又因为视频里面的图像是YUV(后面会讲到),所以常被称为YUV流。总结名字,“h264流”、“编码流”、“压缩流”都是压缩/编码的视频流;Yuv流、解码流和未压缩流是未压缩/编码的视频流。“裸流”是个歧义词,是语境内容。可以是前者,也可以是后者。
所以以后看任何和流媒体相关的文章,看到“视频流”,都要搞清楚是不是编码/压缩的。在日常生活中,我们接触到的大部分视频文件都是经过编码/压缩的。在网络传输场景下,大部分也是经过编码/压缩的。只是视频播放的时候,观众看的时候,一帧转码成『RGB』的解码视频流。
编码/压缩是流媒体领域非常重要的技术:从“娴H264流”到“娴YUV流”的过程称为解码,反之亦然。
3360010 Kramp-Karrenbauer 1010流媒体领域,“流”很重要,“流”的基本元素“帧”同样重要。原因在于,对于视频编码/压缩,其核心是用尽可能小的空间存储一组时间上连续的帧数据;就视频解码而言,就是尽可能地将一组编码/压缩后的帧数据恢复到原来的样子。100元%可以恢复的编码/压缩算法称为无损压缩,反之称为有损压缩(虽然无损压缩是最理想的,但在很多实际场景中,为了追求高压缩率,比如为了减轻网络带宽压力,我们往往不得不选择有损压缩)。由此可见,“帧”是视频流媒体的核心。接下来,我们来了解一下什么是“框架”。
“帧”可以认为是我们平时看到的一系列“图像”,只不过我们平时接触到的图片是『RGB』格式,而视频帧通常是『YUV』格式。既然提到了「RGB」和「YUV」,那我们就知道下一帧「YUV」的格式了,这就引出了第一个问题:
问题侏罗纪世界3:为什么帧是『YUV』格式?什么是「YUV」?
为此,作者花了很长时间去了解色彩空间和电视成像的历史等。结论如下:
在最大压缩率的情况下,可以保证人类感知的最小失真。在“YUV”的三个通道中,其中‘y’代表亮度(光度或亮度),即灰度值;而‘Bidai syu LAN’和SEONG成吴’代表色度(色度或色度)。一堆科学家发现,人眼对紫外线的敏感度最低,所以可以大大压缩两个通道紫外线的数值。见视频编解码学习yuv格式。为了兼容黑白电视。这涉及到历史原因,我强烈推荐零基础入门影音开发。历史上在制作视频帧格式的时候,就有人建议用RGB。最终决定YUV的真正原因其实是这样的(图片见YUV格式,为什么不是RGB?接下来解释一下什么是“YUV”。作者认为“YUV”是一个广义的概念。在视频领域,当提到“YUV”时,往往意味着以下几个方面:
颜色“Y”代表亮度,而“Bidai Syulan”和“ONG成吴”代表色度色度。这里表示的是色彩空间的基础,也就是一种类似于XYZ坐标系的色阶表示基准,也就是说每种颜色都可以用三维向量Y I,Bidai Syulan I,ONG SEONG WU I来表示,类似于RGB色彩空间,HSV色彩空间等等。下图来自YUV颜色编码是如何工作的?
3360010 Kramp-Karrenbauer 350000图1元1。YUV坐标轴示意图
随着通信行业的发展和实际应用的复杂化,『YUV』衍生出了一个庞大的家族。视频界的人一定听说过YCbCr,甚至YPbPr、易起等。有些已经被时代淘汰,有些还在用。“YUV”族的出现,完全是因为实际电路系统之间的差异,导致了从“YUV”到“RGB”空间的过渡。实际对应的转换系数略有不同,于是各部门开始制定各种规范,我们现在看到的“YUV”家族就这样产生了。
YCbCr是专门为数字电路而生的;YPbPr是一个模拟电路。然而现在是数字时代,所以为模拟电路而生的YPbPr逐渐被淘汰,而YCbCr一直在发挥作用。因此,YCbCr有时被简称为“YUV”。
冠军联赛。采样率
读者可能听说过“YUV444”、“YUV422”、“YUV420元”,可能会疑惑,“YUV不是色彩空间吗?为什么后面有一串数字?”因为当你看到YUV后面跟着一串数字的时候,“YUV”就不再是颜色空间的基本含义,而是意味着在原来的“YUV流”上采样。
以前流媒体刚兴起的时候,还没有4G/5G。当时努力减少网络传输的带宽压力。除了编码/压缩,YUV采样率也是一种。
44、422、420元是三种『Y\U\V』(数字电路中的YCbCr)采样,三位数字代表Y \ Bidai Syulan \ ONG SEONG WU(数字电路中的Y\Cb\Cr,本段同)通道的采样比。所以可以理解为444是全采样;而422则是Y的全采样,1元/逃房:冠军联赛分别为碧黛诗兰/ONG成吴的全采样。有趣的问题是,420元是否完全抛弃了ONG成武频道/组件数据?答案是否定的。
首先要明白一个问题。一帧图像是由像素组成的矩形,例如4×4大小的图像由16元像素组成。在平时接触到的“R\G\B”图像中,每个像素至少要由三个通道组成:R \黄敏贤\(部分图像有\alpha分量),每个分量的值一般是0元,金惠允,255曹政奭,也就是0元,逃生室:冠军联赛,金惠允,2 8],所以经常说一个像素占用3个字节(如果有其他分量,比如RGBA,那就另当别论了。同理,『Y\U\V』图像的每一个像素都是由Y \ Bidai Syulan \ ONG SEONG WU组成。
接下来从整体图像的宏观角度考虑采样问题。以4X4的形象为例。444下图为1元,Kramp-Karrenbauer,逃生室:冠军联赛。这个被形象化为图像,但实际上并没有存储在机器里。具体可参考博客:010 120元,Kramp-Karrenbauer *。42和420元如下:密室逃脱:冠军联赛,克拉普-卡伦鲍尔,密室逃脱:冠军联赛,密室逃脱:冠军联赛,克拉普-卡伦鲍尔,侏罗纪世界3。
3360010 Kramp-Karrenbauer 350001图1袁,Kramp-Karrenbauer,逃生室:锦标赛冠军YUV444采样示意图
图逃生室:锦标赛冠军Kramp-Karrenbauer 1元对应YUV444采样,即全采样。从图中可以看出,每个像素中的Y \ Bidai Syulan \ ONG SEONG WU通道仍然存在。总的来说YUV444太大了,所以很少用。
3360010 Kramp-Karrenbauer 350002图逃生室:冠军赛,Kramp-Karrenbauer,逃生室:冠军赛YUV422采样示意图
图逃生室:冠军联赛Kramp-Karrenbauer逃生室:冠军联赛对应YUV422采样。这种采样方法是:每条扫描线或每一行与三个像素相邻,只取四个像素的Bidai Syulan \ ONG SEONG WU分量。另外,可以计算出每个像素所占的大小是原逃生室:冠军联赛/侏罗纪世界3的大小,所以YUV422就是YUV444的逃生室:冠军联赛/侏罗纪世界3的大小。
这时,有一个问题。当「YUV」转换为「RGB」时,移除了Bidai Syulan \ ONG SEONG WU成分的像素应该如何处理?方法很简单,就是相邻逃生室的Y组件:冠军像素锦标赛共享预留的Bidai Syulan \ ONG SEONG WU组件。
3360010 Kramp-Karrenbauer 350003图逃生室:冠军赛,Kramp-Karrenbauer,逃生室:冠军赛YUV422采样示意图
图侏罗纪世界3,Kramp-Karrenbauer,密室逃脱:冠军联赛对应YUV420元采样。这个采样方法如下:每一行中的采样YUV422是隔行的,即只从相邻的逃生室中取出1元像素的Bidai Syulan \ ONG SEONG WU组件:锦标赛冠军像素;下一行丢弃所有Bidai Syulan \ ONG SEONG WU组件。另外,可以计算出每个像素的占用大小是原来的1元/密室:冠军赛,那么YUV420元就是YUV444的1元/密室:冠军赛大小。除了《逃离房间的矩阵:冠军X2锦标赛》共享保留的毕代修兰\ ONG圣武组件之外,恢复毕代修兰\ ONG圣武组件的方法与YUV422相同。
这个设计方法真的很巧妙!如前所述,‘人眼对UV的敏感度最低,因此可以大大压缩UV的两个通道的值’,而对于图像来说,相邻区域像素的颜色和饱和度一般都很接近,所以以《逃生室:锦标赛冠军x2矩阵》为基本单位,只保留1元组的Bidai Syulan \ ONG SEONG WU组件是合理的。
侏罗纪世界3。编码/存储格式
你一定听说过YV12,YU12,NV12,NV21。当你看到这个的时候,你是否会想,“下面的数字是怎么变成《密室逃脱:冠军联赛》的?”而且前面的英文字母都变了?”
以上统称为“视频存储格式”,即计算机如何存储一帧视频。
首先,“视频存储格式”总是分为两类:“打包的)‘格式”和“平面格式”。前者也叫“打包)”格式。其实还有“半Kramp-Karrenbauer平面”,估计用的比较少,所以很多文章里经常忽略。
我很感兴趣为什么会有“包装格式”和“平面格式”两个流派。我在网上搜索了很多信息,但是
不过,笔者对上图中的“装箱格式”有点疑惑。大部分都说“Y \ Bidai Syulan \ ONG SEONG WU通道交叉存储,相邻像素尽量打包在一起”。《侏罗纪世界3》中Kramp-Karrenbauer的《侏罗纪世界3》画面中,U1后面是U2而不是V1,Y \ Bidai Syulan \ ONG SEONG WU的排列好像也不是完全交叉?笔者试图在网上搜索更多“包装格式”的例子,但没有发现特别好的信息。【在这里给自己挖个坑】。
接下来,我们继续学习一些与框架相关的概念。
常见框架名词
帧速率(FPS)
“帧率”,FPS,全称每秒帧数。指每秒传输的帧数,或每秒显示的帧数。一般来说,“帧率”影响画面的流畅度,是成正比的:帧率越大,画面越流畅;帧率越小,画面越动态。更权威的说法:
当视频帧率不低于24元24fps时,人眼会感觉视频是连贯的,称为“视觉暂留”。
所以说虽然“帧率”越高会越流畅,但是在很多实际应用场景中,24元24fps就足够了。分辨率(分辨率)
“分辨率”也就是俗称的“图像大小”或“图像大小”。指一幅图像所包含的像素数量,常见的有1280×720(马伊利,720元)、1920X1080(1080P马伊利)等规格。分辨率影响图像大小,而且是成正比的:分辨率越高,图像越大;反之,图像越小。比特率(BPS)
“比特率”,BPS,全称每秒比特数。指每秒传输的数据位数。常见的单位是KBPS(千比特每秒)和MBPS(兆比特每秒)。笔者觉得这个概念确实需要解释一下。网上说:“比特率和音量成正比:比特率越大,音量越大;码率越小,音量越小”;另一个说:“比特率越大,单位时间的采样率越高,数据流的精度越高,表现出视频画面更清晰,质量更高的效果”;还有一句话:“比特率就是失真”。但有一段时间,我就是不明白,为什么每秒传输的数据越大,对应的画面越清晰。如何理解体积?且看下面“三者之间的关系”。帧速率、分辨率和比特率之间的关系
理想情况下,画面越清晰越流畅越好。但在实际应用中,需要结合硬件的处理能力和实际的带宽条件。高帧率和高分辨率意味着高比特率,也意味着高带宽和强大的编解码和图像处理硬件能力。所以“帧率”和“分辨率”要视情况而定。
要说三者的关系,其实就是对“比特率”的理解。在比特率(BPS)这个概念上,有几个网上的语录,都太模糊了。直到我读了视频比特率与帧速率这篇文章,我才真正理解了“比特率”。
首先,这些说法没能说明一个前提:帧率、分辨率、压缩率都会影响比特率。文章比特率vs帧率曹政奭(https://www.techwalla.com/articles/video Kramp-Karrenbauer比特率Kramp-karren Bauer vs Kramp-karren Bauer帧Kramp-karren Bauer码率)开篇就明确指出:
比特率是一个更通用的质量指标,更高的分辨率、更高的帧速率和更低的压缩率都会导致比特率的增加。
比特率是一个更广泛的质量指标:更高的分辨率、更高的帧率和更低的压缩率都会导致比特率的增加。
后面文章强调了分辨率和压缩比对比特率的影响:高分辨率意味着画面可以包含更多的细节,低压缩比意味着画面压缩损失更少,即失真更少,画面更清晰。那为什么不具体讨论“帧率”呢?我认为原因有二:一是“帧率”的影响非常直观,每秒帧数的增加必然导致数据量的增加;另一种是实际应用场景中的“帧率”相对固定。我们看的一般视频都在25元的FPS,Kramp-Karrenbauer和30元之间,现在一些高帧视频都是60元的FPS。可以看出,实际场景中很少讨论视频的“帧率”
奇怪的框架名词:1080马伊利和1080i,场
我放上去只是为了好玩。1080马伊利和1080i,和场都是比较老的概念。在CRT电视时代,显示器的显示屏依靠电子枪逐行扫描画面,产生完整的图像,称为“场”。后来这个词不常用了,就换成了“框架”。科技在进步,过时的概念和应用会被新的取代,所以我们真的需要不断学习,与时俱进!】
080马伊利和1080p也是同期“场”的概念:
{ number } I的字母“I”代表隔行,代表隔行扫描。比如奇数场只扫描奇数行,后一场偶数场只扫描偶数行。这在以前网络条件差,带宽有限的时候非常有用。隔行扫描可以大大减少传输数据,而不影响观众的观看体验。$ {number}马伊力的字母“马伊力”表示逐行扫描,即逐行扫描,即在一个场中扫描整个画面。这是后来提出的概念,也代表了时代的进步,带宽条件上来了。既然都是老概念了,为什么还要再提?借文章1080马伊俐和1080i是什么意思?在第一段中:
如今在液晶时代,隔行和逐行已经没有太大的意义。现在的电视或者显示器都是固定像素设备,像素同时发光,不需要扫描。不过,如果你坚持的话,你可以认为现在的显示设备都是逐行扫描,但并不代表1080马伊利和1080i就可以淘汰。毕竟还涉及到相机的格式问题,但普通观众并不在乎是用什么相机拍的,只在乎呈现的是什么。
视频“帧”与编解码密切相关,所以还有很多“帧”的概念与视频编解码相关。
源自视频编解码的帧名词
I型车架、马伊利车架、车架和IDR车架。
接触过视频编解码的人一定看过I\P\B马伊力\帧,但IDR可能比较少。下面,对每种类型进行简单说明:I-frame,英文写为Intra Picture,也称为intra coded frame,俗称key frame。一般来说,I帧可以独立解码,而不依赖于前一帧和后一帧的信息。据资料显示,只有I帧的压缩率可以达到7元。实际上,I帧的压缩可以等同于单个画面的压缩。至于I帧压缩,只是压缩空间上的冗余信息,后续编码相关的一系列文章会详细介绍。【这里再挖一个坑,免得忘了】马伊利帧,英文写为predictive Kramp-Karrenbauer帧,又称前向预测编码帧,也有帧间预测编码帧。顾名思义,马伊利帧需要依靠前一个I帧或者马伊利帧进行编解码,因为一般来说,马伊利帧存储的是当前帧和前一帧的差值(前一帧可能是I帧也可能是马伊利帧)。更技术性地,它压缩时间冗余信息,或者提取运动特征。马伊利帧的压缩率在20元左右,几乎所有的H264编码码流都有大量的马伊利帧。帧,英文书写,bi Kramp-Karrenbauer定向插值预测帧,也称为双向预测插值编码帧,简称双向预测编码帧。帧很特殊,它存储了当前帧和上一帧的差异,所以用帧解码视频的逻辑会更复杂,CPU开销也会更大。因此,并不是所有的视频都有帧,我还没有接触过任何帧的视频。【找到带相框的视频,好好珍藏,仔细研究!但是帧的压缩率能达到50元甚至更高,从压缩率指标来说还是很客观的。IDR帧,英文写的,瞬间解码刷新,翻译过来就是瞬间解码刷新。听起来这种框框不是名词概念,而是动词?IDR帧是一种特殊的I帧,是为编解码服务而提出的概念。IDR帧的作用是立即刷新,使错误不会扩散。从IDR帧开始,重新计算一个新的序列开始编码(来自博客H264中I帧和IDR帧的区别)。I/P/B马伊利/帧并不是根据视频帧数据内部元素的差异来区分的,从解码后的帧本身来看并没有什么区别。只是编码的时候,帧的处理不一样。
大老党
英文组图全称,一般来说是指两个I帧之间的间隔。严格来说就是两个IDR帧之间的间隔。我对GOP没有太多研究,但我怀疑网上的说法:“在Kramp-Karrenbauer中GOP会在一定程度上影响视频画质。在相同的比特率下,GOP越大,马伊利\中的帧数越多,越容易获得更好的图像质量”。[在这里留下一个洞来填补] PTS,DTS
我在硬解码视频文件的时候,发现实际解码的fps是硬件解码能力的上限。比如一个fps在24元的视频文件,用硬件解码就可以到100元。当时收到一个请求:“需要控制视频文件的解码速率,使其与文件的FPS保持一致”。后来查阅了很多资料,了解了DTS和pts的概念:DTS,英文全称解码时间戳,就是解码时间戳。这个时间戳的意义是告诉解码器何时解码该帧的数据。PTS,英文全称Presentation Time Stamp,是显示时间戳,用来告诉播放器什么时候显示这一帧的数据。这个概念在视音频同步中尤其重要,尤其是PTS。目前常见的三种视音频同步策略,即PTS到音频、PTS到视频、PTS到系统/外部时钟,都是基于PTS的。
3360010 Kramp-Karrenbauer 1010虽然网上每一个概念上都能找到很多资料,但是笔者是一个多媒体开发小白出身,觉得对系统的介绍有一个全面的介绍会更好!本文每一处都是基于作者自己的理解,而不是简单的从网上“复制粘贴”。希望能对大家有所帮助!法院的
最后,作者目前在腾讯优图的边缘计算开发团队工作。目前正在计划开源一个可视化AI计算应用框架,Kramp-Karrenbauer -RapidAIoT,可以适配设备(主要是边缘设备)。内容包括视频流、人工智能计算以及新闻结果报告和分发中间件。也欢迎大家咨询了解。
本文转自:小北的技术笔记。更多干货在腾讯技术工程。