使用 AWS Lambda 在 S3 中保存的 wav 文件的持续时间

问题描述

目标

使用 node.js 计算 AWS Lambda 保存在 S3 中的 wav 文件的持续时间。我不得不在 lambda 层 (Downloaded linux-64 version from here) 中添加 ffmpegffprobe 可执行文件。这些文件可以在 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)

我猜它不支持 wav 格式,但互联网搜索没有提供证据。

这里需要注意的一点是,当我在本地机器上运行此代码时,我能够获得本地文件的持续时间,但是我有一台 Windows 机器,所以也许只有 ffprobe 的 linux 可执行文件有问题?>

我正在寻找的可能解决方

  1. 有没有办法指定格式?
  2. 我可以使用不同的库吗(相同的代码示例)?
  3. 在上述场景(AWS Lambda NodeJS 和 S3 文件(私有文件))中,有没有可能获得 wav 文件的持续时间?

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...