尝试使用Amazon Lambda / nodejs 8.我的目标是启动ffmpeg,生成一个短片并将其上传到S3存储桶。
我在image resize tutorial之后创建了这个函数。编辑代码以从ls
或cat /proc/cpuinfo
等简单的linux命令获取输出 - 一切正常。
现在,由JohnVan Sickle为i686添加了ffmpeg二进制文件 - ffmpeg static build(谢谢!)。更改了代码以启动简单的ffmpeg命令,该命令应该创建一个2秒的小视频剪辑。
根据日志,这失败了,信号SIGSEGV
返回到close的“child_process.spawn()”事件处理程序
据我了解,这可能是由于ffmpeg二进制与静态构建不兼容造成的。或者在我的代码中出现了一些错误。
几个npm模块依赖于johnvansickle.com/ffmpeg的静态构建,并且在他们的github上没有提交这样的问题。也许我犯了其他一些错误?
我应该在AWS Lambda引擎盖下的Amazon Linux AMI amzn-ami-hvm-2017.03.1.20170812-x86_64-gp2
下自己编译ffmpeg吗?
UPD。从同一个AMI启动EC2 t2.micro实例,下载了相同的ffmpeg静态构建,它在命令行中运行良好。现在我怀疑这是一个汇编问题。
还尝试将ffmpeg可执行文件复制到/tmp/ffmpeg
和chmod 755
以确保。通过ffmpeg --help
运行简单的child_process.execSync()
命令返回“错误:命令失败:/ tmp / ffmpeg --help”
const join = require('path').join;
const tmpdir = require('os').tmpdir;
const process = require('process');
const fs = require('fs');
const spawn = require('child_process').spawn;
const exec = require('child_process').exec;
const async = require('async');
const AWS = require('aws-sdk');
const util = require('util');
process.env['PATH'] = process.env['PATH'] + ':' + process.env['LAMBDA_TASK_ROOT'];
const tempDir = process.env['TEMP'] || tmpdir();
const filename = join(tempDir, 'test.mp4');
const s3 = new AWS.S3();
exports.handler = function(event, context, callback) {
var dstBucket = srcBucket + "resized";
var dstKey = "render-test.mp4";
async.waterfall([
function transform(next) {
var args = [
'-filter_complex',
'"testsrc=r=25:s=640x480:d=3"',
'-an',
'-y',
'-hide_banner',
'-c:v', 'libx264',
filename,
];
console.log("Will launch ffmpeg");
const childProcess = spawn('ffmpeg', args);
childProcess.on('close', function(e) {
console.log('ffmpeg close event: ' + JSON.stringify(arguments));
next();
});
console.log("After launched ffmpeg");
},
function upload(next) {
...
}
], function (err) {
...
});
};
固定。尽管来自JohnVanSickle.com的ffmpeg的静态构建确实在Lambda environment中提到的AMI的Amazon EC2实例上运行,但同样的二进制文件无法在AWS Lambda下执行。
我使用markus-perl/ffmpeg-build-script在同一AMI的AWS EC2 t2.micro实例上编译了ffmpeg。它还让我惊讶于error的aom
编解码器版本。更改了脚本中的一行以禁用aom
编解码器,最后编译了ffmpeg。在弱小的t2.micro实例上花了几个小时。
生成的ffmpeg二进制文件比上面提到的静态版本轻约10Mb,并且在AWS Lambda上运行就好了!
希望这会对某人有所帮助。