作者 | 罗松(西流) 阿里巴巴技术专家
本文整理自架构师成长系列 2 月 12 日直播课程。
关注“阿里巴巴云原生”公众号,回复 “212”,即可获取对应直播回放链接及 PPT 下载链接。
前言随着计算机技术和 Internet 的日新月异,视频点播技术因其良好的人机交互性和流媒体传输技术倍受教育、娱乐等行业青睐,而在当前, 云计算平台厂商的产品线不断成熟完善, 如果想要搭建视频点播类应用,告别刀耕火种, 直接上云会扫清硬件采购、 技术等各种障碍,以阿里云为例:
这是一个非常典型的解决方案, 对象存储 OSS 可以支持海量视频存储,采集上传的视频被转码以适配各种终端,CDN 加速终端设备播放视频的速度。此外还有一些内容安全审查需求, 比如鉴黄、鉴恐等。
而在视频点播解决方案中, 视频转码是最消耗计算力的一个子系统,虽然您可以使用云上专门的转码服务,但在很多情况下,您会选择自己搭建转码服务。比如:
- 您已经在虚拟机/容器平台上基于 FFmpeg 部署了一套视频处理服务,能否在此基础上让它有更弹性、更高的可用性?
- 您的需求只是简单的转码需求,或是一些极其轻量的需求,比如获取 OSS 上视频前几帧的 GIF、获取视频或者音频的时长,自己搭建成本更低;
- 各种格式的音频转换或者各种采样率自定义、音频降噪等功能;
- 您有更高级的自定义处理需求,比如视频转码完成后, 需要记录转码详情到数据库, 或者在转码完成后, 自动将热度很高的视频预热到 CDN 上, 从而缓解源站压力;
- 您有并发处理大量视频的需求;
- 您有很多超大的视频需要批量快速处理完, 比如每周五定期产生几百个 4G 以上的大视频, 但是希望当天几个小时后全部处理完;
- 自定义视频处理流程中可能会有多种操作组合, 比如转码、加水印和生成视频首页 GIF。后续为视频处理系统增加新需求,比如调整转码参数,希望新功能发布上线对在线服务无影响;
- 您的视频源文件存放在 NAS 或者 ECS 云盘上,自建服务可以直接读取源文件处理,而不需要将它们再迁移到 OSS 上。
如果您的视频处理系统有上述需求,或者您期望实现一个 弹性、高可用、低成本、免运维、灵活支持任意处理逻辑 的视频处理系统,那么本文则是您期待的最佳实践方案。
在介绍具体方案之前, 先介绍两款产品:
- 函数计算 :阿里云函数计算是事件驱动的全托管计算服务。通过函数计算,您无需管理服务器等基础设施,只需编写代码并上传。函数计算会为您准备好计算资源,以弹性、可靠的方式运行您的代码,并提供日志查询、性能监控、报警等功能;
- 函数工作流:函数工作流(Function Flow,以下简称 FnF)是一个用来协调多个分布式任务执行的全托管云服务。您可以用顺序,分支,并行等方式来编排分布式任务,FnF 会按照设定好的步骤可靠地协调任务执行,跟踪每个任务的状态转换,并在必要时执行用户定义的重试逻辑,以确保工作流顺利完成。
免费开通函数计算,按量付费,函数计算有很大的免费额度。
免费开通函数工作流,按量付费,函数工作流有很大的免费额度。
函数计算可靠的执行任意逻辑, 逻辑可以是利用 FFmpeg 对视频任何处理操作, 也可以更新视频 meta 数据到数据库等。
函数工作流对相应的函数进行编排, 比如第一步的函数是转码, 第二步的函数是转码成功后,将相应 meta 数据库写入数据库等。
至此,您应该初步理解了函数计算的自定义处理能力 + 函数工作流编排能力几乎满足您任何自定义处理的需求,接下来,本文以一个具体的示例展示基于函数计算和函数工作流打造的一个弹性高可用的 Serverless 视频处理系统,并与传统方案进行性能、成本和工程效率的对比。
简单视频处理系统假设您是对短视频进行简单的处理, 架构方案图如下:
如上图所示, 用户上传一个视频到 OSS, OSS 触发器自动触发函数执行, 函数调用 FFmpeg 进行视频转码, 并且将转码后的视频保存回 OSS。
OSS 事件触发器, 阿里云对象存储和函数计算无缝集成。您可以为各种类型的事件设置处理函数,当 OSS 系统捕获到指定类型的事件后,会自动调用函数处理。例如,您可以设置函数来处理 PutObject 事件,当您调用 OSS PutObject API 上传视频到 OSS 后,相关联的函数会自动触发来处理该视频。
附:简单视频处理系统示例工程地址
您可以直接基于示例工程部署您的简单音视频处理系统服务,因为音视频是强 CPU 密集型计算,强烈建议直接函数内存设置为 3G(2vCPU),但是当您想要处理大视频(比如 test_huge.mov ) 或者对小视频进行多种组合操作的时候, 您会发现函数还是大概率会执行失败,原因是函数计算的执行环境有最大执行时间为 10 分钟的限制,如果最大的 10 分钟不能满足您的需求, 您可以选择:
- 对视频进行分片 -> 转码 -> 合成处理, 详情参考:fc-fnf-video-processing, 下文会详细介绍。
-
联系函数计算团队(钉钉群号: 11721331) 或者提工单
- 适当放宽执行时长限制
- 申请使用更高的函数内存 12G(8vCPU)
为了突破函数计算执行环境的限制(或者说加快大视频的转码速度),引入函数工作流 FnF 去编排函数实现一个功能强大的全功能视频处理系统是一个很好的方案。
全功能视频处理系统-Example如上图所示, 假设用户上传一个 mov 格式的视频到 OSS,OSS 触发器自动触发函数执行, 函数调用 FnF,并行进行提取音频文件,同时进行 avi,mp4,flv 格式的转码。 所以您可以实现如下需求:
- 一个视频文件可以同时被转码成各种格式以及其他各种自定义处理,比如增加水印处理或者在 after-process 更新信息到数据库等;
- 当有多个文件同时上传到 OSS,函数计算会自动伸缩, 并行处理多个文件;
- 对于每一个视频,先进行切片处理,然后并行转码切片,最后合成,通过设置合理的切片时间,可以大大加速较大视频的转码速度;
所谓的视频切片,是将视频流按指定的时间间隔,切分成一系列分片文件,并生成一个索引文件记录分片文件的信息。
- 结合 NAS + 视频切片, 可以解决超大视频(大于 3G )的转码。
附:全功能视频处理系统示例工程地址
当然, 具体的处理流程是可以根据您的需求修改 fnf 工作流流程, 上面的只是一个示例。
示例效果:
比如短视频处理系统的监控的一个 Example:
函数计算 + 函数工作流 Serverless 方案转码性能表
实验视频为是 89s 的 mov 文件 4K 视频: 4K.mov,云服务进行 mov -> mp4 普通转码需要消耗的时间为 188s, 将这个参考时间记为 T。
视频切片时间FC 转码耗时性能加速百分比45s160s117.5%25s100s188%15s70s268.6%10s45s417.8%5s35s537.1%性能加速百分比 = T / FC转码耗时
从上表可以看出,设置的视频切片时间越短, 视频转码时间越短, 函数计算可以自动瞬时调度出更多的计算资源来一起完成这个视频的转码, 转码性能优异。
更低的成本- 具有明显波峰波谷的视频处理场景(比如只有部分时间段有视频处理请求,其他时间很少甚至没有视频处理请求),选择按需付费,只需为实际使用的计算资源付费;
- 没有明显波峰波谷的视频处理场景,可以使用预付费(包年包月),成本仍然极具竞争力;
函数计算成本优化最佳实践文档。
- 假设有一个基于 ECS 搭建的视频转码服务,由于是 CPU 密集型计算, 因此在这里将平均 CPU 利用率作为核心参考指标对评估成本,以一个月为周期,10 台 C5 ECS 的总计算力为例, 总的计算量约为 30% 场景下, 两个解决方案 CPU 资源利用率使用情况示意图大致如下:
由上图预估出如下计费模型:
- 函数计算预付费 3CU 一个月: 246.27 元, 计算能力等价于 ECS 计算型 C5;
- ECS 计算型 C5 (2vCPU,4GB)+云盘: 包月219 元;
- 函数计算按量付费占整个计算量的占比 =80%998(246.27×3+259.2)
关注打赏
