来自亚马逊Lambda上的ffmpeg的SIGSEGV

问题描述 投票:0回答:1

尝试使用Amazon Lambda / nodejs 8.我的目标是启动ffmpeg,生成一个短片并将其上传到S3存储桶。

我在image resize tutorial之后创建了这个函数。编辑代码以从lscat /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/ffmpegchmod 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) {
    ...
  });
};
node.js amazon-web-services ffmpeg aws-lambda
1个回答
3
投票

固定。尽管来自JohnVanSickle.com的ffmpeg的静态构建确实在Lambda environment中提到的AMI的Amazon EC2实例上运行,但同样的二进制文件无法在AWS Lambda下执行。

我使用markus-perl/ffmpeg-build-script在同一AMI的AWS EC2 t2.micro实例上编译了ffmpeg。它还让我惊讶于erroraom编解码器版本。更改了脚本中的一行以禁用aom编解码器,最后编译了ffmpeg。在弱小的t2.micro实例上花了几个小时。

生成的ffmpeg二进制文件比上面提到的静态版本轻约10Mb,并且在AWS Lambda上运行就好了!

希望这会对某人有所帮助。

© www.soinside.com 2019 - 2024. All rights reserved.