来源:Global Video Tech Meetup:London 主讲人:Olof Lindman 内容整理:张志宇 本次演讲主要介绍了 SVT 公司开发的可扩展的视频转码工具 encore,以及 encore 是如何在 SVT 的 VoD 流水线中保证并行质量和稳定性的。encore 在 github 上的开源链接为 https://github.com/svt/encore。
目录
- 前言
- 动机
- Encore 简介
- Encore 工作流
- Encore Job
- Profile
- Command Builder and Queue
- Command Builder
- Queue
- 应用
前言
SVT 是瑞典的国家公共服务广播公司,SVT Play 是 SVT 的 OTT 流媒体平台。SVT Play 每天需要转码处理约 65 - 90 小时的 VoD (Video on Demand,视频点播) 内容。其中包括约 300 段的不足一分钟的小视频片段,45 - 55 小时左右的高质量视频,18 小时左右的新闻以及一些难以分类的视频。转码这些视频时会面临许多问题,例如需要按时发布这些视频,而且要在尽可能低码率的情况下保证较好的视频质量。在 SVT Play 中这些大量的视频内容通过 encore 进行转码处理。
动机
在最早的时候,大部分视频相关行业的研发人员通过许多台本地的硬件服务器对视频进行转码。但是这些服务器需要足够稳定才能保证将所有的高质量视频全部转码。
利用多台本地硬件服务器进行视频转码
而如今随着技术不断进步,大部分的研发人员会选择一些新的方法。例如使用云服务器代替本地服务器进行转码,或是使用分布式转码,将原始视频分片,将分片视频放到云服务器中进行转码,实现快速且高质量的转码。
利用云端服务器进行分布式视频转码
出于许多原因,SVT Play 处理视频时并不能在云端进行转码,也不能使用分布式转码,而只能使用本地的硬件服务器对视频进行转码。然而 SVT 仍然必须处理不断出现且不断增加的大量高质量视频,因此 SVT 开发了内部转码器 encore。
Encore 简介
encore 是一种可扩展的高度可配置的视频转码工具,建立在 FFmpeg 和 Redisson 等开源巨头之上。encore 旨在扩展和抽象 FFmpeg 的转码能力,并为转码提供简单的解决方案。encore 针对需要可扩展视频转码工具的高级技术用户,例如,作为其 VoD 转码流水线的一部分。
encore 的简单总结
Encore 工作流
encore 的工作流可以分为 5 个步骤:
- 创建一个 encore job;
- job 被放入一个队列。当该 job 按照优先级排列到队列头部时,将其从队列中取出,进行转码;
- 收集即将到来的转码任务所需的元数据,例如,分析输入文件,读取配置文件,生成 FFmpeg 的命令,并将其传给一个 encore 的实例;
- 转码开始(FFmpeg 转码开始);
- 输出文件被写入配置的目的地。
encore 的工作流程
Encore Job
encore job 是对输入文件进行转码所需信息的汇总 —— 输入文件、配置文件和优先级等信息。
- encore job 描述了应如何处理输入文件;
- 一个 encore job 可以有多个输出文件和一个输入文件;
- encore job 有一个 profile,它基本上描述了 job 应该如何配置它的转码;
- encore job 有一个 priority,它本质上描述了应如何确定 job 的优先级。
Profile
profile 可以看作是 FFmpeg 配置的一般抽象,例如,要使用的比特率、要使用的编解码器。
- profile 指定了 encore job 使用的大部分配置 —— 元数据、FFmpeg 配置和特定的编解码器配置;
- profile 以 yaml 格式指定。
Command Builder and Queue
encore 是在 FFmpeg 的框架上进行扩展的,其中有两部分的扩展是非常重要的,一个是 command builder,另一个是 queue。
encore 基于 FFmpeg 的两个重要扩展
Command Builder
为了理解 command builder 的重要性和工作原理,首先需要了解 SVT 在 OTT 服务中面临的困难。作为一个大型的广播公司,SVT Play 通常需要处理很多不同格式的媒体文件,有些格式甚至是一个世纪以前的。
用 FFmpeg 进行转码时会碰到的问题
以广播中最常见的格式 DNxHD 1080i50 185x 为例,在没有任何特殊指令的情况下,如果用 FFmpeg 处理该格式的视频,需要花费很多的工作去思考应该怎么处理。假如把它分为视频和音频两部分,对于视频需要思考的问题是这个视频是交错的吗?对于音频,会有 8-16 段的音频流,每段都有一道单音轨,需要思考哪段音轨是要用的,哪一段是要用作混音的。更坏的情况是,有些格式是已经被弃用的,你甚至不知道该如何去解码这个视频。
Command Builder 的工作原理
command builder 的出现解决了这个难题。encore job 包含了 pofile 和一些特殊的指令(例如如何裁剪)。将输入的视频文件放入 analyser 类中,它会自动分析视频的格式,并输出矩阵或 zip 文件,将 profile 、特殊指令和 analyser 的输出全部放入 command builder 中后就可以生成 FFmpeg 命令,之后就可以进行转码。视频格式分析的任务是自动完成的,这解决了之前提到的困难,节省了原本必须手动完成的工作。
Queue
尽管 SVT Player 需要处理大量视频,但这些视频的优先级都是不同的,有些视频可能需要马上被转码并发布,例如新闻,有些视频可能需要在三个月后才需要进行转码发布。通常情况下,这些优先级你都是事先知道的。通过 encore 的 queue 技术可以实现处理不同优先级的视频。
queue 允许设置一个或多个不同的队列完成不同的任务。一旦创建了一个 encore 的实例,就会产生 threat slot 跟 queue 相对应。在 queue handling 中使用了反向优先级的技术。意思是每个实例的第一个 thread slot 会且只会从第一个优先级队列中挑选视频,每个实例的第二个 thread slot 将从查看第一个优先级队列开始。如果那里什么都没有,它将转移到第二优先级队列,并从那里选择视频并进行转码。显然第三个 thread slot 将查看第一优先级队列,如果那里什么都没有,它将移动到第二个优先级队列,如果同样也什么都没有,它将移到第三个优先级队列。
Queue 处理不同优先级任务的过程
显然,queue 实现了在转码视频中的优先处理。最高优先级的视频将会首先被转码,这意味着我们不用担心在处理一长串优先级低的视频时阻止了优先级高的新闻视频的处理。同时,在保持优先级的情况下,这个技术也保证了硬件将工作在饱和的状态,不会有资源被闲置浪费掉。
应用
encore 的应用场景
encore 的一个应用场景是 procedural transcoding ,在使用 encore 时,可以设置 queue 保证将必须处理的内容首先转码,并打包发布发布后,可以再返回,看看有没有剩余的资源,如果有,那么可以使用剩余的资源对原内容进行补充(例如加字幕或使用更好的编解码器),再重新打包,重新发布。保证在不增加码率的情况下提升视频质量,甚至做到在减少码率的情况下提升视频质量。
相同码率下的视频质量比较(右边是encore)
encore 使用更低的码率且提升视频质量
附上演讲视频:
http://mpvideo.qpic.cn/0b2eriaacaaax4aj36naozqvbcwdagfaaaia.f10002.mp4?dis_k=4146c2216aeef02e3c5daeb629cd5bcb&dis_t=1638411715&vid=wxv_2152909909196144649&format_id=10002&support_redirect=0&mmversion=false