Instagram如何将视频编码时长缩短94%?

Max 2022年12月8日

图片

编者按:眼看用户视频的增长将超过服务器的算力上限,既没有额外的服务器来支持,也不能对用户体验造成大的冲击,Instagram的工程师找到了两种编码过程中重复计算的部分,并将他们合二为一,如此便可节省可观的算力。他们是如何做到的呢?

作者:Ryan Peterman, Haixia Shi
译者:核子可乐
审校:Haixia Shi

图片

  • 在对效率的不断追求当中,Instagram的工程师们开发出一种新的视频处理方法,能够将基础视频编码的耗时缩短94%。

  • 有了这种方法,Meta的视频基础设施无需添加更多设备即可吸纳更多负载。

  • 由此释放出的资源,可让更多用户观看高清编码流,提供更加清晰流畅的视频体验。这对网络连接不佳国家/地区的用户尤其有益。

Instagram的用户群体不断增长,目前月度活跃用户已超20亿。受众的迅速扩张也要求我们的服务器集群提供更好的性能体验。2021年初,我们的预测表明在未来12个月内,现有基础设施已经不足以消化所有用户的视频上传负载。但凭借对效率的不断追求,Instagram在工程师们开发出一种新的视频处理方法,无需向视频基础设施内添加更多设备即可吸纳更多负载。

Instagram会为用户上传的视频创建多种编码版本,不同版本间各有特性。而只要利用一种类型的视频编码辅助生成另一种类型,即可将观看次数较少的视频所占用的编码计算资源减少94%。由此释放出的更多资源可用于生成更多高清编码视频流,让更多用户获得更清晰、更流畅的播放体验。

Instagram如何分配视频计算资源

对于上传至Instagram的每段视频,我们都会为其生成两种视频编码版本:

  1. 基础编码,能够适配所有Instagram客户端,其压缩率较低、可以在较陈旧的设备上顺畅解码和播放。

  2. 高级编码,使用更新的压缩技术以提升播放质量。在以下示例中的两端视频帧可以看到,我们完全能够用更低码率提供更清晰的画面细节(请注意,与左侧视频相比,右侧视频的清晰度明显更高)。

问题在于,其中基础视频编码占用了我们超过八成的计算资源储备。如果继续沿着这个路线发展,那么基础编码功能将在一年内耗尽Instagram的全部资源。到那个时候,用户上传视频后需要等待更长时间才能完成发布,甚至根本无法正常发布。相比之下,我们的高级编码只占总观看时长的15%,预计将所有算力都花在基础编码上之后,高级视频编码将没有任何资源可用。

移除冗余工作负载

对于其中的基础视频编码部分,Instagram又具体划分出两种类型。对于每段上传视频,我们首先会生成最基础的自适应码率(ABR)版本,也就是最低功能类型。这样一来,客户就可以选择最适合当前连接速度的版本,防止带宽波动导致的画面卡顿——所谓的自适应码率就是这个意思。

另外一种则是很少用到的渐进式编码(另一种最低功能类型),我们同样会持续生成这个版本,以保证其与无法支持ABR的旧版Instagram应用相兼容。

传统上,我们从客户端上传至后端的原始文件会分别对应ABR和渐进式编码两个版本。这个进程会占用计算资源——如以下终端命令所示,将23秒长的视频转码为720p,共需要86.17秒的CPU时间。

$ time ffmpeg -i input.mp4 -vf scale=-1:720 -c:v libx264 output.mp4
86.17s user 1.32s system 964% cpu 9.069 total

我们注意到,这两组编码具有相似的设置——使用相同的编解码器,只是编码配置文件和预设略有区别。于是我们意识到,完全可以用渐进式编码的视频帧替换掉基础ABR编码,也就是将其重新打包为支持ABR的文件结构。如此一来,也就消除了生成基础ABR编码所对应的成本。以下终端命令表明,生成manifest文件并将视频帧重新打包为相同输入视频且支持ABR格式的文件结构,只需要0.36秒:

$ time MP4Box -add input.mp4 -dash 2000 -profile dashavc264:onDemand -out manifest.mpd 
video_output.mp4
0.36s user 2.22s system 95% cpu 2.690 total

这种方法省出了高级编码所占用的算力,牺牲掉的则是我们基础ABR编码的压缩效率。但我们认为,提高高级编码的生成比例对于Instagram用户而言应该是好事

图片

建立框架,验证我们的理论

在投入生产之前,我们得先验证这个理论。如果单纯比较基础ABR编码在变更前后的占比区别,并不足以得出有意义的结论。我们还需要衡量高级编码占比增加后的净值。从下图可以看到,从基础ABR中释放出算力之后,用户观看高级编码视频的时间确实更长了。这应该足以抵消我们发明的新基础ABR算法牺牲掉的压缩效率。

图片

为了做出进一步量化,我们还构建了一套测试框架,其中的测试池和控制池复制了一小部分用户流量。我们将各个池内的视频编码保存至不同的命名空间,稍后作为视频控制目录或测试目录中的一部分。这样在交付时,人们就只能看到来自其中某一目录的编码,帮助我们衡量新的编码方案是否更好。

图片

在此次测试中,我们证明虽然测试池中基础ABR编码的压缩效率有所下降,但高级编码视频的观看时间变得更长、足以抵消这部分损失。

推向生产

在上线这项优化后,我们的基础编码与高级编码视频观看时间有了显著变化。新的编码方案将基础ABR编码的生成成本降低了94%。凭借更多可用资源,我们能够将高级编码的观看时间占比提升至33%。换句话说,如今有更多Instagram用户能够体验到更清晰、更流畅的视频内容了。这对于网络连接不佳国家/地区的用户们尤其有益。

我们的工程创新探索永不止步,Instagram知道不断增长的用户群体正对我们的服务器集群提出越来越高的要求。更多优化即将发布,敬请关注!

本文来自Meta技术博客,LiveVideoStack已获授权转载。

原文链接:https://engineering.fb.com/2022/11/04/video-engineering/instagram-video-processing-encoding-reduction/


图片

还可输入800
全部评论
作者介绍

LiveVideoStack

音视频技术社区

文章

粉丝

视频

阅读排行
  • 2周
  • 4周
  • 16周
热门视频

HLS性能优化之旅

熊子良/资深研发工程师

贝壳找房联络中心的RTC实践

安海波/语音架构师