Ошибка «Недопустимый или неожиданный токен» при попытке выполнить сборку ffmpeg на лямбде - PullRequest
0 голосов
/ 04 января 2019

У меня есть скрипт node.js, который использует ffmpeg для преобразования mp4, загруженного из YT, в mp3 и сохранения в Amazon S3. Загрузка с использованием безсерверной инфраструктуры. Файл "ffmpeg" включен в основной каталог (с .yml), скачанный отсюда: https://johnvansickle.com/ffmpeg/

код:

'use strict'
process.env.PATH = process.env.PATH + ':/tmp/'
process.env['FFMPEG_PATH'] = '/tmp/ffmpeg';
const BIN_PATH = process.env['LAMBDA_TASK_ROOT']
process.env['PATH'] = process.env['PATH'] + ':' + BIN_PATH;

module.exports.download_mp3 = function (event, context, callback)
{
  require('child_process').exec('cp /var/task/ffmpeg /tmp/.; chmod 755 
  /tmp/ffmpeg;', function (error, stdout, stderr) {
  if (error) 
  {
    console.log('An error occured', error);
    callback(null, null)
  } 
  else 
  {
    var ffmpeg = require('ffmpeg');
    const aws = require('aws-sdk')
    const s3 = new aws.S3()
    const ytdl = require('ytdl-core');

    function uploadFromStream(s3) {
      const stream = require('stream')
      var pass = new stream.PassThrough();

      var params = {Bucket: "some-bucket", Key: "some-key", Body: pass};
      s3.upload(params, function(err, data) {
        console.log(err, data);
      });
      console.log("Should be finished")
      callback(null)
    }

    let stream = ytdl("some-video-id", {
      quality: 'highestaudio',
      filter: 'audioonly'
    });

    ffmpeg(stream)
      .audioBitrate(128)
      .format('mp3')
      .on('error', (err) => console.error(err))
      .pipe(uploadFromStream(s3), {
        end: true
    });
  }})
}

При срабатывании функция записывает ошибку в журналы:

2019-01-04T14:50:54.525Z    21da4d49-1030-11e9-b901-0dc32b691a16     
/var/task/ffmpeg:1
(function (exports, require, module, __filename, __dirname) { ELF
^

SyntaxError: Invalid or unexpected token
at createScript (vm.js:80:10)
at Object.runInThisContext (vm.js:139:10)
at Module._compile (module.js:616:28)
at Object.Module._extensions..js (module.js:663:10)
at Module.load (module.js:565:32)
at tryModuleLoad (module.js:505:12)
at Function.Module._load (module.js:497:3)
at Module.require (module.js:596:17)
at require (internal/module.js:11:18)
at /var/task/download.js:17:18

Это, безусловно, ошибка в файле "ffmpeg", о котором я упоминал выше (ссылка предоставлена). Но я не знаю, в чем именно проблема, я последовал за первым ответом: https://stackoverflow.com/questions/47882810/lambda-not-connecting-to-ffmpeg, чтобы включить сборку ffmpeg.

1 Ответ

0 голосов
/ 04 января 2019

Это не ошибка в загруженном вами двоичном файле ffmpeg. ELF - что является неожиданным токеном - означает, что один из ваших операторов require загружает двоичный файл вместо файла или модуля JavaScript (, что такое ELF - что-то в виде перевода строки? )

Источник ошибки - как говорит трассировка стека - в /download.js:17:18, что составляет var ffmpeg = require('ffmpeg'), поэтому проблемный оператор require - это require('ffmpeg')

Причина, по которой require загружает ffmpeg вместо ffmpeg модулей, заключается в том, что двоичный файл, с одной стороны, находится в одном из мест, где require ищет модули, и обнаруживается до того, как ffmpeg модулей.

...