最佳实践

音视频转码

最近更新时间:2020-08-11 17:54:17

操作场景

在视频、社交应用等场景下,用户上传的图片、音视频的总量大、频率高,对处理系统的实时性和并发能力都有较高的要求。而上传的视频短片,可对应不同的清晰度使用多个云函数对其分别处理,以满足不同场景下用户的需求,同时适应移动网络带宽较小且不稳定的特性。

运行原理

使用云函数、ffmpeg 及对象存储 COS 联动实现音视频转码的运行原理图如下:

在云函数中,可基于不同的编程语言(Python、Node、PHP、JAVA 及 GO)撰写自定义业务逻辑。以转码为例,操作步骤如下:

  1. 创建函数,并在其中部署 ffmpeg 资源包及转码逻辑。
  2. 配置 COS Bucket 触发器,对源视频实时处理加工。旁路生成日志和监控、支持告警。
  3. 对转码后的视频回传 COS,并触发自动预热。

与容器服务的对比

与容器服务对比,使用云函数及 ffmpeg 实现音视频转码服务的优势和不足如下表:

对比项基于容器的实现基于云函数的实现分析
实现方法
  • 在 docker 容器中运行 ffmpeg。
  • ffmpeg 进行了自定义处理,不同版本具备不同的 binary 依赖,均打包为镜像。
  • 自主控制 docker 镜像版本,不同服务加载不同的 docker 镜像,其中包含不同的 ffmpeg。
  • 不同的 ffmpeg 编译为不同的可执行文件,并部署到云函数“层”,和业务逻辑解耦。
  • 编写不同的函数,分别和“层”中不同的 ffmpeg 绑定,提供不同的转码功能。
  • 编写调度函数,分片视频和调度不同的转码服务。
实现方案差异不大。
开发/测试/部署体验
  • 本地开发测试后,触发 CI/CD 流程,烧制镜像,完成部署。
  • 需要维护灰度发布系统,容器服务集群每次更新速度较慢。
  • 本地开发测试后,触发 CI/CD 流程,完成部署。
  • 云函数提供灰度/发布/回滚功能,部署流程可以直接集成 API 接口实现全自动化流程。
  • 个人子账号可以通过 CLI 工具,在测试环境实时开发及调试,效率更高。
在开发流程方面,云函数更加简单高效。
日志/监控/告警 需要在容器集群里启动 Agent,并对接日志平台、监控中心及告警平台。 自带日志/监控/告警能力,同时开放 API 接口,可以对接第三方日志/监控平台。支持运行时启动 Agent 进程,同步上报数据。 云函数自带能力较完善,但如需对接自建平台,启动 Agent 相比容器较复杂。
运维 需自主维护容器集群,弹性伸缩效率较低。 无需维护,云函数保障集群可用性、负载均衡及弹性伸缩。 云函数更加易用。
费用 需根据峰值预留容器资源,存在资源浪费可能性。 根据实际流量弹性伸缩、计费,费用节省30%以上。 云函数具有明显优势。

通过以上与容器的多维度对比,可得出以下结论:
优势

  • 云函数提供标准运行环境,并且保障资源的高可用和弹性伸缩,无需专人维护。
  • 云函数基于实际业务消耗收费,不存在资源浪费。
  • 云函数的开发调试流程效率会更加高效,依赖和业务解耦,可以分别单独更新,支持实时热更新。
  • 运行环境隔离,单次请求失败不影响其他请求的正常执行。

不足

  • 云函数的引入,需要对接现有 CI/CD 流程,开发方式上有一定的转变。
  • 现有业务代码需进行一定程度的改造,主要集中在 ffmpeg 编包上。云函数可以提供编包工具及相关研发协助改造。

前提条件

本文以广州地域为例:

  • 前往 对象存储控制台 创建 COS Bucket,且 Bucket 权限设置为公有读私有写
  • (可选)当视频文件大于500M时,需前往文件存储控制台开通 CFS 服务,用于扩展云函数的本地存储空间。详情请参见 挂载 CFS 文件系统
  • 前往访问管理控制台,创建云函数的运行角色,并授予该角色 COS、CFS 的读写权限,用于授权云函数访问相应服务。详情请参见 创建函数运行角色

操作步骤

创建云函数

  1. 登录 云函数控制台,单击左侧导航栏的【函数服务】。
  2. 在“函数服务”上方选择期望创建函数的地域,并单击【新建】,进入函数创建流程。
  3. 在“新建函数”页面的“基本信息”步骤中,根据以下信息创建函数,并单击【下一步】。如下图所示:
    • 函数名称:自定义函数名称,本文以 Transcode 为例。
    • 运行环境:选择 “Pyhton 3.6”。
    • 创建方式:选择【模板函数】。
    • 模糊搜索:输入“转码”,并进行搜索。
      单击模板中的【查看详情】,即可在弹出的“模板详情”窗口中查看相关信息,支持下载操作。
  4. 在“函数配置”页面,保持默认配置并单击【完成】,即可完成函数的创建。
  5. 进入已创建的云函数“函数配置”页面,单击右上角【编辑】,按以下信息填写函数配置:
    • 环境变量:新增如下环境变量,参考表格进行填写。如下图所示:
      keyvalue
      regionCOS Bucket 所在地域。
      target_bucket转码后的视频,上传到已创建好的 COS Bucket 中。
      target_path转码后的视频,上传到 Bucket 的指定目录中。
    • 运行角色:勾选“启用”,并选择在 前提条件 中已创建的运行角色,本文以 SCF_QcsRole 为例。如下图所示:
      云函数在运行时,会使用运行角色换取临时密钥,操作读取和写入 COS Bucket 的资源。
  6. 单击【保存】保存函数配置。
  7. 选择函数侧边栏【触发管理】,单击【创建触发器】。
  8. 在弹出的“创建触发器”窗口中,参考以下信息创建 COS BUcket 触发器。如下图所示:

    主要参数信息如下,其余选项请保持默认设置:
    • 触发方式:选择“COS触发”。
    • COS Bucket:选择存储桶。若用的同一个 Bucket 存储源视频和转码后的视频,则需在触发器中配置前缀过滤规则\。例如 demo\。
  9. 单击【提交】即可完成触发器创建。

(可选)配置 CFS 挂载

说明:

若您开通了 CFS 挂载服务,则请参考以下步骤在云函数中同时启用私有网络和文件系统挂载能力。

  1. 在的云函数“函数配置”页面,单击右上角【编辑】,参考以下信息进行配置。如下图所示:
    • 私有网络:勾选“启动”,并选择私有网络及子网。
    • 文件系统:勾选“启用”,选择选择在 前提条件 中已创建的文件系统。
  2. 单击【函数代码】页签,进入函数代码编辑页面,修改文件上传路径。如下图所示:

    注释第76行代码,并在77行添加以下代码。
    upload_path = '/mnt/new-'+ key.split('/')[-1]

测试功能

登录 对象存储控制台 ,进入对应的 Bucket 目录下,上传视频文件,并到对应的转码目录下查看,是否生成压缩的视频文件。如下图所示:

说明:

根据视频大小不同,压缩时间也不同。如果视频过大,则压缩时间也会延长,需要较长的时间才能查看到新视频。

扩展能力

基于本文示例,您还可扩展自动化 CDN 刷新/预热的能力。例如,转码后的视频在回传 COS Bucket 时,可触发新函数执行 CDN 刷新/预热功能。详情请参见 CDN 缓存刷新

您还可借助云函数的高并发能力,实现快速转码或者切片功能。例如,函数 A 进行调度任务,函数 B 进行实际的转码/切片工作。可借助 CFS 挂载能力,轻松实现跨函数的文件共享功能。

目录