返回介绍

3.4 音视频处理系统的部署

发布于 2024-01-20 01:12:18 字数 4530 浏览 0 评论 0 收藏 0

我们需要将 ffmpeg 或 ffprobe 上传。看起来比较简单,我们直接将其放在函数代码目录并上传就可以了。

不过这里需要注意的是, 由于 ffmpeg 和 ffprobe 是可执行文件,最终我们需要用到这两个命令,所以在上传到 FaaS 平台之前,需要为其赋予可执行权限。

你可以通过 ls -l 来查看文件的权限:

$ ls -l
-rwxr-xr-x  1 root  staff  39000328  2  9 20:59 ffmpeg
-rwxr-xr-x  1 root  staff  38906056  2  9 21:00 ffprobe

-rwxr-xr-x 分为四部分:

  • 第 0 位-表示文件类型;
  • 第 1-3 位 rwx 表示文件所有者的权限;
  • 第 4-6 位 r-x 是同组用户的权限;
  • 第 7-9r-x 位表示其他用户的权限。

r 表示读权限,w 表示写权限,x 表示执行权限。从文件权限可以看出,针对所有用户这两个文件都有可执行权限。

如果你的这两个文件没有执行权限,则需要通过下面的命令添加权限:

$ chmod +x ffmpeg
$ chmod +x ffprobe
  • 这样在 FaaS 平台上,Node.js 才可以执行这两个命令。
  • 解决了可执行文件的权限问题后,还有一个问题是函数的权限。

由于函数需要读写 OSS,所以我们需要为函数设置角色,并为该角色添加管理 OSS 的权限。如果你不清楚如何授权,可以复习一下 “10|访问控制:如何授权访问其他云服务?”的内容。

在我提供的示例代码中,我在 template.yaml 的第 7 行设置了函数的角色 acs:ram::1457216987974698:role/aliyunfclogexecutionrole,文件内容如下所示:

ROSTemplateFormatVersion: '2015-09-01'
Transform: 'Aliyun::Serverless-2018-04-03'
Resources:
  serverless-video:
  Type: 'Aliyun::Serverless::Service'
  Properties:
  Role: acs:ram::1457216987974698:role/aliyunfclogexecutionrole
  Description: '基于 Serverless 开发高可用音视频处理系统'
  get_duration:
  Type: 'Aliyun::Serverless::Function'
  Properties:
  Handler: index.handler
  Runtime: nodejs12
  Timeout: 600
  MemorySize: 256
  CodeUri: ./.serverless/get_duration
  get_meta:
  Type: 'Aliyun::Serverless::Function'
  Properties:
  Handler: index.handler
  Runtime: nodejs12
  Timeout: 600
  MemorySize: 256
  CodeUri: ./.serverless/get_meta
  ......

细心的你可能发现了,在该 YAML 配置中,函数的 CodeUri 不是./functions/get_durtion,而是./.serverless/get_meta,这是为什么呢?

这主要是因为我们需要对函数代码进行构建,./.serverless/get_duration 对应的是构建后的代码。之所以需要构建,是为了解决 common/utils.js 代码共用的问题。

如果不对代码进行构建,直接部署 functions/get_duration 中的代码,函数执行时就会报错:Cannot find module ‘../common/utils,因为 common/utils.js 不在入口函数目录中,没有部署到 FaaS 上。

要解决这个问题,就需要对代码进行构建,将函数及依赖的所有代码构建为单个文件,这样部署时就只需要部署一个文件,不涉及目录和依赖的问题了。

我们可以使用 ncc 这个工具对函数进行构建,使用方法如下:

$ ncc build ./functions/get_duration/index.js -o ./.serverless/get_duration/ -e ali-oss

该命令就会将 functions/get_duration/index.js 进行构建,最终会将 index.js 以及缩依赖的 exec、getOSSClient 等方法进行编译,最终合并为一个文件并输出到 ./.serverless/get_duration/ 目录中。

这里还需要注意的是-e ali-oss 这个参数,含义是构建时,排除 ali-oss 这个依赖,也就是不将其编译到最终的 index.js 文件中。这是因为函数计算的 Node.js 运行时内置了 ali-oss 模块,所以我们的构建产物就不需要包含 ali-oss 的代码了。

处理对代码进行构建,我们还需要将 ffmpeg 和 ffprobe 复制到对应的函数目录中。最终我将这些步骤编写到了 build.js 中,内容如下:

// build.js
const { exec } = require("./functions/common/utils");
async function build() {
  // 清空编译目录
  await exec("rm -rf .serverless/*");
  // 编译 get_duration 函数
  await exec("mkdir -p ./.serverless/get_duration");
  await exec(`ncc build ./functions/get_duration/index.js -o ./.serverless/get_duration/ -e ali-oss`);
  await exec("cp ./ffprobe ./.serverless/get_duration/ffprobe");
  // 编译 get_meta 函数
  await exec("mkdir -p ./.serverless/get_meta");
  await exec(`ncc build ./functions/get_meta/index.js -o ./.serverless/get_meta/ -e ali-oss`);
  await exec("cp ./ffprobe ./.serverless/get_meta/ffprobe");
 
  //...
}
build();

然后我在 package.json 中添加了两个命令:

  • build 构建函数
  • deploy 构建并部署

例如你开发完成后需要部署,就可以直接运行:

$ npm run deploy
> serverless-video@1.0.0 deploy
> npm run build && fun deploy
> serverless-video@1.0.0 build
> node build.js
rm -rf .serverless/*
mkdir -p ./.serverless/get_duration
ncc build ./functions/get_duration/index.js -o ./.serverless/get_duration/ -e ali-oss
using template: template.yml
Waiting for service serverless-video to be deployed...
  Waiting for function get_duration to be deployed...
  Waiting for packaging function get_duration code...
  The function get_duration has been packaged. A total of 2 files were compressed and the final size was 15.2 MB
  function get_duration deploy success
......
service serverless-video deploy success

部署成功后,我们就可以对函数进行测试了,可以直接在控制台上运行函数,也可以通过 fun invoke 执行函数:

$ fun invoke get_duration
{
  "format": {
  "duration": "170.859000"
  }
}

强调下面几点:

  • Serverless 除了适合 Web 接口、服务端渲染等场景,还适合 CPU 密集型的任务;
  • 基于 Serverless 开发的音视频处理系统,本身就具备弹性、可扩展、低成本、免运维、高可用的能力;
  • 对于需要通过代码执行的命令行工具等依赖,部署到 FaaS 平台之前需要为其设置可执行权限;若函数依需要调用其他云产品的接口,需要为函数授予相应权限;
  • 对于添加水印、视频转码等消耗资源的操作,需要为函数设置较大的内存和超时时间。

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据
    我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
    原文