Испытание Amazon Lambda / nodejs 8. Моя цель - запустить ffmpeg, сгенерировать короткий клип и загрузить его в корзину S3.
Я создал функцию, следуя инструкции Изменение размера изображения . Отредактировал код для получения вывода от простых команд linux, таких как ls
или cat /proc/cpuinfo
- все работает.
Теперь добавлен двоичный файл ffmpeg для i686 - Статическая сборка ffmpeg от JohnVan Sickle (спасибо!). Изменен код для запуска простой команды ffmpeg, которая должна создать небольшой 2-секундный видеоклип.
Сбой, согласно журналам, с сигналом SIGSEGV
, возвращаемым обработчику событий close * child_process.spawn ()
Насколько я понимаю, это может быть вызвано двоичной несовместимостью ffmpeg со статической сборкой. Или по какой-то ошибке в моем коде.
Несколько модулей npm используют статические сборки с johnvansickle.com/ffmpeg, и на их github нет таких проблем. Может быть, я допустил еще одну ошибку?
Должен ли я сам скомпилировать ffmpeg под Amazon Linux AMI amzn-ami-hvm-2017.03.1.20170812-x86_64-gp2
, который находится под капотом AWS Lambda?
upd. Запустил экземпляр EC2 t2.micro из того же AMI, загрузил ту же статическую сборку 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) {
...
});
};