Discord 的 Go Live 功能旨在以足够低的延迟带来高质量、高帧率的游戏或应用程序流,让观众可以与流媒体实时对话和互动。点击这里查看我们第一篇关于 Go Live 的博文。
为了达到 Go Live 所需的质量和速度,Discord 使用自己的自定义捕获和编码代码,与操作系统和视频驱动程序集成,使用 WebRTC 将视频从流媒体传输到观众。
为了保持低延迟,WebRTC 会根据传输过程中的实时情况不断调整目标比特率和帧速率。
即使对参数进行了调整,我们也发现 Go Live 的视觉质量或编码性能并不令人满意。使用 AMD 显卡的会话似乎尤其糟糕,甚至有 Discord 工作人员告诉我们,他们使用 AMD 显卡的新电脑上的流媒体体验很不流畅,而且块状。
那么……我们该如何解决这个问题呢?让我们一起努力,将 Go Live 做到最好。
关键帧过多
在视频压缩中,”关键帧 “是一个独立的视频帧,不依赖于之前的内容。当有新观众加入 Go Live 会话或现有观众丢失前一个画面时,必须发送一个新的关键帧。在新的关键帧之后,会使用一个小得多的 “delta 帧”,它只对上一帧的变化进行编码。
在运行良好的 Go Live 流中,关键帧的数据量通常是 delta 帧的 6 到 10 倍。这些关键帧需要足够大,以便为后续帧提供足够的上下文,但又要足够小,以免造成用户网络拥塞或降低视频传输速度。避免关键帧优化所带来的权衡的一种方法是发送尽可能少的关键帧。
在优化 Go Live 的过程中,我们发现对关键帧和 delta 帧的一些调整会导致编码器完全重置,每次参数更新都要生成一个新的关键帧。我们不再是每 60 秒获得一个关键帧,而是每当 webrtc 发出帧速率变化的信号时,我们就会吐出关键帧,最多可达每秒一次!以如此快的速度发送这些大型关键帧占用了所有分配的带宽。
为了实现每分钟一个关键帧的目标,我们一直要求编码器在帧频计数更新时,大约每秒更新一次内部关键帧间隔。然而,这个 API 总是会强制生成一个新的关键帧。因此,我们不再调用该 API,而是开始在外部计算帧数和时间,以确定何时插入关键帧。
更改我们用来向编码器请求关键帧的 API 后,这个问题就迎刃而解了!现在,系统只需每 60 秒发送一次关键帧,从而大大减少了关键帧占用的带宽。更少的带宽,更多的流媒体,更多的乐趣!
低质量关键帧
我们取得了进展!但是,关键帧和视频流其他部分的视觉质量仍然欠佳。如果关键帧的质量较低,编码器就很难让其他帧看起来很好,尤其是高复杂度的内容,比如您一直想流式传输的新 4X 战略游戏。此外,关键帧的像素内容会被 delta 帧重复使用,这意味着如果关键帧不好,这些 delta 帧看起来也会更糟糕!
尽管最终的视频流看起来不是很好,但我们注意到编码器并没有充分利用分配给视频流的比特率。为什么我们的编码器没有使用所有可用比特来提高视频流的质量呢?
通过观察编码器输出的每个压缩帧,我们发现质量不佳似乎是由于编码器严格遵守了我们给它制定的速率目标规则造成的!我们要求编码器以目标比特率的相同分数对每一帧进行编码——例如,在 60 fps 下,我们要求每一帧的比特率不超过平均比特率的六十分之一。
这初看起来似乎很合理,但编码器没有足够的比特来启动一个新的关键帧,因为没有任何比特可以从以前的图片中继承下来。编码器将帧目标视为硬限制,因此在帧内的速率分配上比较保守,这导致每帧都达不到目标。而当编码器在某一帧未达到目标时,它就无法将剩余的比特用于下一帧。
通过放宽比特率平均值的预期时间段,我们获得了质量更高的关键帧和关键帧后的更高质量,并实现了更接近目标比特率的平均比特率。
受到丢帧的困扰
此时,关键帧和后续帧看起来都好了很多,在应用程序之外的独立编码也运行良好。然而,当我们将所有这些功能接入 Discord 时,我们看到了一些……奇怪的结果:在使用新的编码配置进行流媒体播放时,帧速率有时会从 60 fps 迅速降至 30 fps,并一直保持在这个水平。
当我们对这些新的低帧率进行深入研究后,我们发现了一些奇怪的现象: 如果 WebRTC 认为编码器超出了目标比特率,它偶尔会丢弃一些帧。出现这种情况时,我们会重新配置编码器,使用管道运行时的较低帧频。这实际上意味着为每个剩余帧分配更多比特,从而导致单帧大小增加,帧数下降。这个过程不断重复,直到降帧器降下一半的帧,将 60fps 降为 30fps。
一旦发现问题,就很容易解决!考虑到实际帧频与目标帧频之间的差异,编码器会留出一点余量,这样就不会再出现降帧后超支的情况。另外,由于捕捉管道滞后等其他原因造成的帧数下降也不会超支,因为它们会自行恢复。
有了这一修复措施,实现的帧速率不仅能恢复,还能超过以前的水平!
结语
由于关键帧的减少和不太严格的速率控制,我们能够大幅提高 AMD 显卡的感知质量,比如我们的工作人员所使用的显卡。虽然不那么严格的速率控制会导致一些直接的 FPS 下降,但我们能够通过绕过帧下降器的限制来修复 FPS 下降,甚至提高平均 FPS!以 60 FPS 为目标的流媒体的平均 FPS 每秒提高了 2 帧,低于 50 FPS 的会话比例从 39% 降至 18%。
作者:Alex Converse
原文:https://discord.com/blog/from-blocky-to-brilliant-improving-video-quality-on-discord-go-live-on-amd-gpus
本文来自作者投稿,版权归原作者所有。如需转载,请注明出处:https://www.nxrte.com/jishu/yinshipin/48039.html