我有一个节点.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 构建。
这不是您下载的 ffmpeg 二进制文件中的错误。ELF
- 这是意外的令牌 - 意味着您的require
语句之一加载二进制文件而不是JavaScript文件或模块(什么是ELF - 换行符?
错误的起源 - 正如堆栈跟踪所说 - 在/download.js:17:18
var ffmpeg = require('ffmpeg')
,所以有问题的require
语句是你的require('ffmpeg')
require
加载ffmpeg
而不是ffmpeg
模块的原因是,一方面二进制文件位于require
查找模块的位置之一,并且在ffmpeg
模块之前找到。