我们如何将视频编码速度提高八倍

我们如何将视频编码速度提高八倍

每天都有数百万观众在互联网上观看视频。 但要使视频可用,不仅必须将其上传到服务器,还必须对其进行处理。 这种情况发生得越快,对服务及其用户来说就越好。

我叫 Askar Kamalov,一年前我加入了 Yandex 视频技术团队。 今天,我将向 Habr 读者简要介绍我们如何通过并行化编码过程来显着加快向用户传送视频的速度。

这篇文章主要是那些以前没有考虑过视频服务背后发生的事情的人感兴趣的。 在评论中,您可以提出问题并建议未来帖子的主题。

关于任务本身的几句话。 Yandex 不仅可以帮助您搜索其他网站上的视频,还可以为自己的服务存储视频。 无论是原创节目还是直播的体育比赛、KinoPoisk 上的电影还是 Zen 和 News 上的视频 - 所有这些都会上传到我们的服务器。 为了让用户观看视频,需要做好准备:转换为所需的格式、创建预览,甚至通过技术运行 深度高清。 未准备好的文件只会占用空间。 此外,我们谈论的不仅是硬件的最佳使用,还包括向用户交付内容的速度。 示例:可以在比赛结束后一分钟内搜索曲棍球比赛决定性时刻的记录。

顺序编码

因此,用户的幸福感在很大程度上取决于视频可用的速度。 而这主要是由转码速度决定的。 当对视频上传速度没有严格要求时,那么就没有问题。 您获取一个不可分割的文件,对其进行转换并上传。 在我们的旅程开始时,我们是这样工作的:

我们如何将视频编码速度提高八倍

客户端将视频上传到存储,Analyzer组件收集元信息并将视频传输到Worker组件进行转换。 所有阶段均按顺序执行。 在这种情况下,可以有许多编码服务器,但只有一个忙于处理特定视频。 简单、透明的图表。 这就是它的优势所在。 该方案只能垂直扩展(由于购买了更强大的服务器)。

具有中间结果的顺序编码

为了以某种方式缓解痛苦的等待,业界提出了一种快速编码选项。 这个名称具有误导性,因为事实上,完整的编码是按顺序发生的,并且需要同样长的时间。 但有一个中间结果。 这个想法是这样的:尽快准备并发布视频的低分辨率版本,然后才发布更高分辨率的版本。

一方面,视频变得更快。 它对于重要事件很有用。 但另一方面,图像变得模糊,这让观众感到恼火。

事实证明,您不仅需要快速处理视频,还需要保持其质量。 这就是用户现在对视频服务的期望。 购买最高效的服务器(并定期一次全部升级)似乎就足够了。 但这是一个死胡同,因为总有一个视频会让即使是最强大的硬件变慢。

并行编码

将一个复杂的问题分成许多不太复杂的问题并在不同的服务器上并行解决它们会更有效。 这是用于视频的 MapReduce。 在这种情况下,我们不受一台服务器性能的限制,并且可以水平扩展(通过添加新机器)。

顺便说一句,将视频分割成小块,并行处理它们并将它们粘合在一起的想法并不是什么秘密。 您可以找到许多对此方法的参考(例如,在 Habré 上,我推荐了一篇关于该项目的帖子 分布式VIDc)。 但这并没有让事情变得更容易,因为你不能直接采用现成的解决方案并将其构建到你的家中。 我们需要适应我们的基础设施、视频甚至负载。 一般来说,自己编写会更容易。

因此,在新架构中,我们将顺序编码的单体Worker块划分为微服务Segmenter、Tcoder、Combiner。

我们如何将视频编码速度提高八倍

  1. 分段器将视频分成大约 10 秒的片段。 片段由一个或多个 GOP 组成(一组图片)。 每个 GOP 都是独立的并单独编码,因此可以在不参考其他 GOP 的帧的情况下对其进行解码。 也就是说,片段可以彼此独立地播放。 这种分片减少了延迟,从而可以更早地开始处理。
  2. Tcoder 处理每个片段。 它从队列中获取一个任务,从存储中下载一个片段,将其编码为不同的分辨率(请记住,玩家可以根据连接速度选择版本),然后将结果放回存储中并将片段标记为已处理在数据库中。 处理完所有片段后,Tcoder 发送任务以生成下一个组件的结果。
  3. Combiner将结果收集在一起:下载Tcoder制作的所有片段,生成不同分辨率的流。

关于声音的几句话。 最流行的 AAC 音频编解码器有一个令人不快的功能。 如果您单独对片段进行编码,那么您根本无法将它们无缝地粘合在一起。 过渡将会很明显。 视频编解码器不存在此问题。 理论上,您可以寻找复杂的技术解决方案,但这款游戏根本得不偿失(音频的重量明显小于视频)。 因此,只有视频被并行编码,而整个音轨被处理。

结果

借助并行视频处理,我们显着减少了视频上传给我们和供用户使用之间的延迟。 例如,以前可能需要两个小时才能为一部时长一个半小时的全高清电影创建多个不同质量的完整版本。 现在这一切只需要15分钟。 此外,通过并行处理,我们创建高分辨率版本的速度甚至比使用旧的中间结果方法创建低分辨率版本的速度还要快。

还有一件事。 使用旧方法,要么没有足够的服务器,要么没有任务而闲置。 并行编码可以增加铁回收的份额。 现在我们的集群有一千多台服务器,总是忙着处理一些事情。

事实上,仍有改进的空间。 例如,如果我们在视频完整到达之前开始处理视频片段,就可以节省大量时间。 正如他们所说,还会有更多。

在评论中写下您想阅读的视频处理领域的哪些任务。

行业同事经验的有用链接

来源: habr.com

添加评论