我正在尝试通过Lambda函数将S3视频文件转换为音频文件。每当将视频文件上传到S3存储桶时,我都必须生成音频文件,然后通过触发AWS Lambda函数将其保存回S3存储桶。我可以将视频文件转换为本地音频。 (Convert video to an audio file using FFMPEG)。但是我想知道,每次将视频文件上传到S3存储桶时,如何在Lambda函数中执行此转换部分。我不知道如何执行此AWS Lambda函数。请分享您的建议。
示例代码:
var ffmpeg = require('fluent-ffmpeg');
/**
* input - string, path of input file
* output - string, path of output file
* callback - function, node-style callback fn (error, result)
*/
function convert(input, output, callback) {
ffmpeg(input)
.output(output)
.on('end', function() {
console.log('conversion ended');
callback(null);
}).on('error', function(err){
console.log('error: ', e.code, e.msg);
callback(err);
}).run();
}
convert('./df.mp4', './output.mp3', function(err){
if(!err) {
console.log('conversion complete');
//...
}
});
谢谢
答案 0 :(得分:2)
您只需要在s3存储桶上放置一个事件-放置对象-即可触发lambda函数(您可以通过lambda函数的第一个参数访问上传到该S3存储桶的对象的描述)。
如果您可以使用某些外部库在本地计算机上将视频文件转换为音频,则需要创建一个zip文件,其中包含lambda函数(在zip文件的根目录中)以及相关性。
对于Node,这非常简单。创建一个新文件夹,运行npm init
,安装所需的模块,并在其中放置Node代码的地方创建index.js文件。压缩此文件夹的所有内容(而不是文件夹本身)。创建新的lambda函数时,请选择上传此zip文件。
如果您想知道如何以编程方式与AWS资源通信并进行操作,请检查aws-sdk
可以将其作为模块导入并用于此目的。
因此,基本上,您需要在lambda函数中进行的操作是解析event
参数(第一个参数)以获得存储桶和上载对象的键。然后,您将调用s3.getObject
方法来获取数据。使用自定义逻辑处理数据。调用s3.putObject
将新转换的数据存储到新的S3位置。
如果您的代码需要在其中存储一些数据,则Lambda可以访问其自己的本地文件系统。您只需要指定文件的绝对路径,例如/tmp/output.mp3
。要检索它,可以使用fs
模块。然后,您可以继续s3.putObject
。