【问题标题】:"Invalid or unexpected token" error when trying to execute ffmpeg build on lambda尝试在 lambda 上执行 ffmpeg 构建时出现“无效或意外令牌”错误
【发布时间】:2019-01-04 23:27:54
【问题描述】:

我有一个 node.js 脚本,它使用 ffmpeg 将从 YT 下载的 mp4 转换为 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 构建。

【问题讨论】:

  • 如果无法访问您的环境就很难调试。你可能在不同的地方搞砸了。在require('ffmpeg') 之前的console.dir(require.resolve( 'ffmpeg')) 为您显示什么?

标签: javascript amazon-web-services ffmpeg aws-lambda serverless-framework


【解决方案1】:

这不是您下载的 ffmpeg 二进制文件中的错误。 ELF- 是意外标记 - 意味着您的其中一个 require 语句加载二进制文件而不是 JavaScript 文件或模块 (what is ELF - something line feed?)

错误的根源 - 正如堆栈跟踪所说 - 在 /download.js:17:18var ffmpeg = require('ffmpeg'),所以有问题的 require 语句是你的 require('ffmpeg')

require 加载 ffmpeg 而不是 ffmpeg 模块的原因是一方面二进制文件位于 require 查找模块的位置之一,并且在ffmpeg 模块。

【讨论】:

  • 问题是,我复制了一些代码而没有真正研究它。该脚本正在导入“ffmpeg”,而它应该导入“fluent-ffmpeg”。
  • @almarc 但最初的问题仍然存在,节点要么在不应该在的地方搜索模块,要么在不应该在的地方拥有ffpmeg 二进制文件的副本。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-12-04
  • 2019-01-02
  • 2017-10-20
  • 2023-03-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多