问题描述
目标
使用 node.js 计算 AWS Lambda 保存在 S3 中的 wav 文件的持续时间。我不得不在 lambda 层 (Downloaded linux-64 version from here) 中添加 ffmpeg
和 ffprobe
可执行文件。这些文件可以在 lambda 文件系统的 /opt
文件夹中找到。
我的尝试
我一直在尝试以多种方式使用 ffprobe,但我收到 Invalid Data
作为错误。
举个例子
const AWS = require('aws-sdk');
const s3 = new AWS.S3();
const fs = require('fs');
const ffmpeg = require('fluent-ffmpeg');
exports.handler = async function(event) {
let path = await load();
console.log(`Saved Path ${path}`);
ffmpeg.setFfmpegPath('/opt/ffmpeg');
ffmpeg.setFfprobePath("/opt/ffprobe");
let dur = await duration(path).catch(err => {
console.log(err);
})
console.log(dur);
}
function duration(path) {
return new Promise((resolve,reject) => {
ffmpeg(path).ffprobe(path,function(err,Metadata) {
//console.dir(Metadata); // all Metadata
if (err) {
reject(err);
}
else {
resolve(Metadata.format.duration);
}
});
})
}
async function listFiles(path) {
console.log('list files');
return new Promise((resolve,reject) => {
fs.readdir(path,(err,files) => {
if (err) {
console.error('Error in readdir');
reject(err);
}
else {
console.log('recieved files');
resolve(files);
}
});
});
}
async function load() {
return new Promise((resolve,reject) => {
let params = {
Key: 'Fanfare60.wav',Bucket: 'samplevideosshamim'
};
console.log(`Getting s3 object : ${JSON.stringify(params)}`);
s3.getobject(params,data) => {
if (err) {
console.error(err);
reject(err);
}
else if (data) {
console.log('Recieved Data');
let path = `/tmp/${params.Key}`;
console.log('Path: ' + path);
fs.writeFileSync(path,data.body);
resolve(path);
}
});
});
}
错误:
Error: ffprobe exited with code 1
ffprobe version 4.2.1-static https://johnvansickle.com/ffmpeg/ copyright (c) 2007-2019 the FFmpeg developers
built with gcc 6.3.0 (Debian 6.3.0-18+deb9u1) 20170516
configuration: --enable-gpl --enable-version3 --enable-static --disable-debug --disable-ffplay --disable-indev=sndio --disable-outdev=sndio --cc=gcc-6 --enable-fontconfig --enable-frei0r --enable-gnutls --enable-gmp --enable-libgme --enable-gray --enable-libaom --enable-libfribidi --enable-libass --enable-libvmaf --enable-libfreetype --enable-libmp3lame --enable-libopencore-amrnb --enable-libopencore-amrwb --enable-libopenjpeg --enable-librubberband --enable-libsoxr --enable-libspeex --enable-libsrt --enable-libvorbis --enable-libopus --enable-libtheora --enable-libvidstab --enable-libvo-amrwbenc --enable-libvpx --enable-libwebp --enable-libx264 --enable-libx265 --enable-libxml2 --enable-libdav1d --enable-libxvid --enable-libzvbi --enable-libzimg
libavutil 56. 31.100 / 56. 31.100
libavcodec 58. 54.100 / 58. 54.100
libavformat 58. 29.100 / 58. 29.100
libavdevice 58. 8.100 / 58. 8.100
libavfilter 7. 57.100 / 7. 57.100
libswscale 5. 5.100 / 5. 5.100
libswresample 3. 5.100 / 3. 5.100
libpostproc 55. 5.100 / 55. 5.100
/tmp/Fanfare60.wav: Invalid data found when processing input
at ChildProcess.<anonymous> (/var/task/node_modules/fluent-ffmpeg/lib/ffprobe.js:233:22)
at ChildProcess.emit (events.js:314:20)
at ChildProcess.EventEmitter.emit (domain.js:483:12)
at Process.ChildProcess._handle.onexit (internal/child_process.js:276:12)
这里需要注意的一点是,当我在本地机器上运行此代码时,我能够获得本地文件的持续时间,但是我有一台 Windows 机器,所以也许只有 ffprobe 的 linux 可执行文件有问题?>
我正在寻找的可能解决方案
解决方法
暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!
如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。
小编邮箱:dio#foxmail.com (将#修改为@)