SIGSEGV из ffmpeg на Amazon Lambda - PullRequest
       7

SIGSEGV из ffmpeg на Amazon Lambda

0 голосов
/ 07 апреля 2019

Испытание 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) {
    ...
  });
};

1 Ответ

3 голосов
/ 08 апреля 2019

Fixed. Несмотря на вводящий в заблуждение факт, что статическая сборка ffmpeg от JohnVanSickle.com действительно выполняется на экземпляре AMI Amazon EC2, упомянутом в Lambda environment , тот же двоичный файл не выполняется в AWS Lambda.

Я скомпилировал ffmpeg на экземпляре AWS EC2 t2.micro того же AMI, используя markus-perl / ffmpeg-build-script . Это также удивило меня ошибкой версии кодека aom. Изменена одна строка в скрипте, чтобы отключить кодек aom, и, наконец, ffmpeg скомпилирован. Потребовалось пару часов на слабом экземпляре t2.micro.

Полученный двоичный файл ffmpeg на ~ 10 МБ легче статической сборки, упомянутой выше, и отлично работает на AWS Lambda!

Надеюсь, это кому-нибудь поможет.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...