返回介绍

3.3 获取视频时长函数的实现

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

首先是获取视频时长的实现,也就是 get_duration 函数。我们可以通过 ffprobe 来获取视频时长,命令如下:

$ ffprobe -v quiet -show_entries format=duration -print_format json -i video.mp4
{
  "format": {
  "duration": "170.859000"
  }
}

其中-print_format json 是指以 JSON 格式输出结果,-i 是指定文件位置,可以是本地文件,也可以是网络上的远程文件。

所以获取视频时长的函数逻辑就是: 下载 OSS 中的文件到本地,然后运行 ffprobe 命令得到视频时长,最后返回视频时长。

为了让代码尽可能复用,所以我在 common/utils.js 中实现了一些公共方法,代码大致如下:

// common/utils.js
// ...
/**
 * 运行 Linux 命令
 * @param {string} command 待运行的命令
 */
async function exec(command) {
  console.log(command)
  return new Promise((resolve, reject) => {
  child_process.exec(command, (err, stdout, stderr) => {
  if (err) {
  console.error(err)
  return reject(err);
  }
  if (stderr) {
  console.error(stderr)
  return reject(stderr);
  }
  console.log(stdout)
  return resolve(stdout);
  });
  });
}
/**
 * 获取 OSS Client
 * @param {object} context 函数上下文
 */
function getOssClient(context) {
  // 获取函数计算的临时访问凭证
  const accessKeyId = context.credentials.accessKeyId;
  const accessKeySecret = context.credentials.accessKeySecret;
  const securityToken = context.credentials.securityToken;
  // 初始化 OSS 客户端
  const client = oss({
  accessKeyId,
  accessKeySecret,
  stsToken: securityToken,
  bucket: OSS_BUCKET_NAME,
  region: OSS_REGION,
  });
  return client;
}
module.exports = {
  exec,
  getOssClient,
  OSS_VIDEO_NAME,
};

common/utils.js 的代码主要就包含两个方法:exec 和 getOssClient,分别用来执行 Linux 系统命令和获取 OSS 客户端。

这样我们在 functions/get_duration/index.js 中就可以直接引入并使用了:

// functions/get_duration/index.js
const { exec, getOssClient, OSS_VIDEO_NAME } = require("../common/utils");
/**
 * 获取视频元信息
 * @param {object} client OSS client
 */
async function getDuration(client) {
  const filePath = "/tmp/video.mp4";
  await client.get(OSS_VIDEO_NAME, filePath);
  const command = `./ffprobe -v quiet -show_entries format=duration -print_format json -i ${filePath}`;
  const res = await exec(command);
  return res;
}
module.exports.handler = function (event, context, callback) {
  // 获取 OSS 客户端
  const client = getOssClient(context);
  getDuration(client)
  .then((res) => {
  console.log("视频时长: \n", res);
  callback(null, res);
  })
  .catch((err) => callback(err));
};

首先注意第 20 行,我们通过 getOssClient 获取到 OSS 客户端,然后调用 getDuration 函数执行业务逻辑,也就是获取视频时长。

在 getDuration 中,我们先下载视频到临时目录/tmp/video.mp4 中,临时目录是可以读写的,当前代码目录只能写不能读。然后在第 13 行,通过 exec 执行了获取视频时长的命令,最后将得到的结果返回。

这样获取视频时长的功能就开发完成了。

获取视频元数据等其他函数与获取视频时长的实现是非常类似的,不同之处主要在于执行的命令,也就是第 12 行的 command 变量。具体实现可以参考我的示例代码,这里就不赘述。

由于该系统包含多个函数,且函数不仅依赖了 ffmpeg ,还依赖了公共的 common/utils.js ,所以很多同学就犯难了,这些函数应该怎么部署呢?

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

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

发布评论

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