手记

关键帧,帧间和视频压缩

image

视频压缩的默认心理图像涉及不需要的视频伪像,如图像中的像素化和块效应。尽管如此,实际上压缩视频内容的复杂性仍然很短。特别是,它忽略了一个称为帧间的迷人过程,它涉及关键帧和增量帧,以便以一种意图不被注意的方式智能地压缩内容。

本文详细介绍了此过程,同时还提供了可应用于IBM Cloud Video实时流式传输的最佳实践和理想编码器设置。由于自适应比特率,这些具体建议大部分涉及流式传输。要了解有关该技术的更多信息,请参阅我们的  自适应流传输如何解决查看器带宽问题白皮书。

了解视频帧

流媒体技术有很多术语和方面可以理所当然。随着某人成为一名广播公司,有必要更详细地了解元素,以了解流程的原因以及最佳设置。

例如,一个关键帧是一些广播公司之前已经提到过的东西,或者看到像Wirecast这样的编码器中的设置,却没有完全意识到它是什么以及这个过程对于流媒体有多么有益。关键帧是一个重要元素,但实际上只是较长过程的一部分,有助于减少视频所需的带宽。要理解这种关系,首先需要了解视频帧。

从高层开始,大多数人可能意识到视频内容由一系列帧组成。通常表示为FPS(每秒帧数),每帧是静止图像,当按顺序播放时,创建运动图像。因此,使用30的FPS创建的内容意味着有30个“静止图像”将播放每秒视频。

压缩的机会:InterFrame

在一般的视频中,如果有人要连续拍摄90帧并将它们展开,他们会看到很多相同的元素。例如,如果某人正站在一动不动的植物旁边说话,那么与该植物相关的信息就不会发生变化。结果,这就是用来传达某些东西没有改变的大量浪费带宽。

关键帧的静止帧

因此,在寻找压缩视频内容的有效方法时,帧管理成为基石原则之一。因此,如果示例中的工厂不会改变,为什么不继续在一些后续框架中使用相同的元素来减少空间?

这种认识催生了帧间预测的概念。这是一种视频压缩技术,它将帧划分为宏块,然后查找块之间的冗余。此过程通过使用关键帧(也称为i帧或帧内帧)增量帧来实现,增量帧仅存储图像中的更改以减少冗余信息。这些帧的集合通常由“图片组”的相当非技术性的声音名称来引用,缩写为GOP。用于编码或解码数字数据流的视频编解码器都具有某种形式的帧间管理。H.264,MPEG-2和MPEG-4都使用三帧方法,包括:关键帧,p帧和b帧。

什么是关键帧?

关键帧(i帧)是视频中图像的完整帧。后续帧(增量帧)仅包含已更改的信息。关键帧将在流中多次出现,具体取决于它的创建方式或流式传输方式。



如果有人使用Google“关键帧”,他们可能会找到一些与动画和视频编辑相关的结果。在这个例子中,我们使用关键帧一词来说明它与视频压缩的关系及其与增量帧的关系。

关键帧和P或B帧示例

P帧如何工作?

也称为预测帧或预测帧,p帧遵循另一帧并且仅包含视频中的图像的一部分。由于这个原因,它被归类为三角形框架。P帧向后看向前一个p帧或关键帧(i帧)以进行冗余。p帧中呈现的图像量取决于帧之间包含的新信息量。

例如,有人在静态背景前与相机交谈可能只包含与其移动相关的信息。然而,有人在相机平移的情况下穿过一个场地,每个p帧都会有更多的信息来匹配它们的移动和不断变化的背景。

什么是B帧?它们与P帧有何不同?

也称为双向预测帧,b帧遵循另一帧并且仅包含视频中的图像的一部分。b帧中包含的图像量取决于帧之间的新信息量。

与p帧不同,b帧可以向后和向前看到前一个或后一个p帧或关键帧(i帧)以进行冗余。与p帧相比,这使得b帧更有效,因为它们更有可能发现冗余。但是,当编码配置文件在编码器内设置为基线时,不使用b帧。这意味着编码器必须设置在基线以上的编码配置文件中,例如“main”或“high”。

你如何设置关键帧?

关于用于直播的视频压缩,在编码器内设置关键帧。这是由编码器内部有时称为“关键帧间隔”的选项配置的。

关键帧间隔控制在视频中创建关键帧(i帧)的频率。关键帧间隔越高,通常对内容应用的压缩越多,尽管这并不意味着质量明显降低。有关关键帧间隔如何工作的示例,如果您的间隔设置为每2秒,并且您的帧速率为每秒30帧,则这意味着大约每60帧生成一个关键帧。

术语“关键帧间隔”不是通用的,大多数编码器都有自己的术语。例如,Adobe Flash Media Live Encoder(FMLE)和vMix使用术语“关键帧频率”来描述此过程。其他程序和服务可能将间隔称为“GOP大小”或“GOP长度”,返回“图片组”缩写。

在编码器级别选择关键帧间隔

在设置关键帧间隔方面,它因编码器而异。

对于FMLE,此选项(表示为“关键帧频率”)可通过单击格式右侧的扳手图标在软件编码器中找到。

在Wirecast中,这是从编码器预设菜单设置的,该选项称为“每帧关键帧”。Wirecast是不同的,因为间隔实际上以帧表示。因此,对于30 FPS广播,将“每帧关键帧”设置为60帧将大致给出2秒的关键帧间隔,因为每秒有30帧。

对于vMix编码器,首先需要点击流媒体附近的齿轮图标,这将打开流媒体设置。接近质量选项的是另一个齿轮图标,单击此按钮将打开一个菜单,可以修改“关键帧频率”。

如何在OBS中设置关键帧间隔


在开放广播软件(OBS)的v0.542b版本中设置关键帧间隔

在开放式广播软件(OBS)中,对于v0.55b之后的版本,可以在“高级”下的“设置”区域中设置关键帧间隔。对于  v0.542b之前的OBS版本,如何修改关键帧间隔并不是很清楚,但这实际上是“设置”的一个组件。在那里,转到Advanced,然后选择“Custom x264 Encoder Settings”。在此字段中,需要输入以下字符串:“keyint = XX”,其中XX是触发关键帧之前的帧数。与Wirecast一样,如果需要2秒的关键帧间隔且FPS为30秒,请输入以下内容:“keyint = 60”。

对于XSplit,关键帧间隔是通道属性的一个组成部分。在视频编码区域下,可以找到一个名为“Keyframe Interval(secs)”的列表。在这最右边是一个齿轮图标。单击齿轮将启动“视频编码设置”弹出窗口。这将允许某人以秒为单位指定关键帧间隔。

关键帧和比特率之间的关系

此解释中的里程可能会有所不同,因为编码器会以不同方式管理比特率和关键帧。使用像Wirecast这样的编码器,人们可能会注意到,与播放某人在移动背景中上下跳跃相比,播放某人与静止背景进行对话的人具有“更高的质量”。当使用它们之间相同的精确平均比特率和关键帧间隔时,可以重现这一点。造成这种情况的原因部分是因为增量帧在跳跃示例中有大量信息要分享。冗余非常少,这意味着需要在每个增量帧上传送更多数据。

但是,如果您有像Wirecast这样的编码器,那么它正在努力将流保持在所选择的平均比特率附近。因此,增量帧中包含的附加信息所需的附加带宽导致质量降低,以试图将平均比特率保持在相同水平附近。

什么是关键帧间隔的最佳设置?

从来没有一个行业标准,虽然10秒经常被称为良好的关键帧间隔,即使不再建议流式传输。建议它的原因是,对于标准的29.97 FPS文件,生成的内容响应足以支持从预览滑块轻松导航。为了解释更多,播放器无法在p帧或b帧上开始播放。因此,使用10秒示例,如果有人试图导航到进入5秒的点,它实际上会将5秒钟移回最近的关键帧并开始播放。这被认为是较小带宽消耗的良好折衷,尽管参考DVD选择使用远小于10秒的东西。

但是,对于直播,推荐级别已大幅下降。其原因是自适应比特率流的出现。对于那些不熟悉自适应流媒体的人来说,这项技术使视频播放器能够根据观看者试图观看时在可用分辨率和/或比特之间动态变化。因此,如果可用,下载速度较慢的用户将获得较低的比特率版本。其他标准(如播放窗口大小)也会影响给定的比特率。

播放器显示关键帧

然而,真正的自适应流媒体不仅在视频内容最初加载时进行此检查,而且还可以基于观看者侧的变化来改变比特率。例如,如果观众要在他们的移动设备上移出Wi-Fi网络的范围,他们将开始使用他们的正常蜂窝服务,这可能导致下载速度变慢。结果,观看者可能正在尝试观看比其下载速度更高的比特率的内容。自适应流技术应该实现这种差异并使切换到不同的比特率。

关键帧间隔在此处起作用,因为在下一个关键帧期间进行切换。因此,如果有人以10秒的间隔进行广播,则意味着在比特率和分辨率可能会发生变化之前可能需要10秒钟。这段时间意味着内容可能会在更改发生之前缓冲在观看者一侧,这可能导致观看者放弃。

因此,建议将实时流的关键帧间隔设置为2秒。这产生了一种结果,其中视频轨道可以在用户可能由于其下载速度降低而经历缓冲之前经常有效地改变比特率。

什么是IDR框架?

我们正在循环这一点,但在讨论什么是IDR帧或瞬时解码刷新帧之前,理解p帧,b帧并在自适应流媒体中获得速成课程是值得的。这些实际上是关键帧,每个关键帧可以是基于IDR或基于非IDR。两者之间的区别在于基于IDR的关键帧是一个硬停止。IDR帧防止p帧和b帧引用在IDR帧之前发生的帧。非IDR关键帧将允许这些帧进一步追溯冗余。

在纸面上,非IDR关键帧听起来很理想:它可以通过允许查看更大的帧样本来减少文件大小。不幸的是,导航出现了很多问题,并且该功能与自适应流媒体不能很好地兼容。对于导航,假设有人开始观看流中的6分钟。这会引起问题,因为p帧和b帧可能引用了观众从未实际访问过的信息。对于自适应流传输,如果更改比特率和分辨率,则会出现类似的问题。这是因为新选择可能引用观看者以不同质量设置观看并且不再平行的数据。出于这些原因,始终建议基于IDR制作关键帧。

通常,编码器将提供打开或关闭基于IDR的关键帧的选项,或者根本不提供选项。对于那些没有提供选项的编码器,几乎可以肯定是因为编码器设置为仅使用IDR帧。

有人应该使用“自动”关键帧设置吗?

简而言之:没有。

原则上,自动关键帧设置非常棒。他们将在场景更改期间手动强制关键帧。例如,如果您从PowerPoint幻灯片切换到在相机前面说话的人的图像,这会强制使用新的关键帧。这是理想的,因为增量帧不会有太多工作,无法在PowerPoint幻灯片和相机图像之间找到冗余。

遗憾的是,此过程不适用于某些自适应流技术,尤其是HLS。HLS过程要求关键帧可预测且同步。使用“自动”设置将在关键帧之间创建可变间隔。例如,关键帧之间的时间可能是7秒,如果场景发生快速变化,则可能是2秒。

在OBS中设置关键帧间隔


在OBS v0.55b中设置整数以禁用自动切换

对于大多数编码器,要禁用“自动更改”或“场景变化检测”功能,这通常意味着表示关键帧间隔。例如,在OBS中,如果关键帧间隔设置为0秒,则自动功能将启动。在此处放置任何数字,如1或2,将禁用自动功能。

如果编码器(如Wirecast)具有“关键帧对齐”选项,则应该知道这不是同一个过程。关键帧对齐是创建特定时间戳的过程,最适合保持广播公司通过编码器同步发送的多个比特率。

完善关键帧策略

随着自适应比特率的出现,该行业处于一个奇怪的时刻,关键帧和实时流的最佳实践有一个非常明确的答案。该战略包括:

  • 将关键帧间隔设置为大约2秒

  • 禁用任何“自动”关键帧功能

  • 利用基于IDR的关键帧

  • 使用高于基线的编码配置文件以允许b帧

该策略允许容易地导航内容,以便在广播之后进行点播观看,同时仍然获得帧管理的好处并节省带宽以减少冗余。它还支持自适应btirate流媒体,这是成功直播的重要元素,能够支持连接速度较慢的观众。



作者:纳兰少
链接:https://www.jianshu.com/p/6c90f0513084


0人推荐
随时随地看视频
慕课网APP