- 一、什么是 Serverless
- 二、编写你的第一个 Serverless 应用
- 三、Serverless 应用是怎么运行的
- 四、如何提高应用开发调试和部署效率
- 五、serverless 应用
- 阿里云函数计算
- 腾讯云函数
- 使用 vercel 部署你的应用-推荐
- 六、场景案例
3.3 获取视频时长函数的实现
首先是获取视频时长的实现,也就是 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 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论