【问题标题】:Reading audio duration in nodejs backend在nodejs后端读取音频持续时间
【发布时间】:2021-07-18 09:28:30
【问题描述】:

我正在尝试计算音频文件的持续时间/长度。音频文件首先上传到 S3,然后在 lambda 中读取。我正在使用图书馆,但它并没有真正的帮助。请记住,我发现的所有解决方案都是针对前端计算的,而不是针对后端的。我正在尝试将文件存储在 temp lambda 文件夹中以使用 mp3 持续时间读取它。当我使用直接 S3 url 时得到两个结果,结果是 0:00,当我使用 s3.getobject 时找不到文件。

s3.getObject({ Bucket: bucketName, Key: `audio/filename` }, function(err, data){   
                if (err) {
                    console.error(err.code, "-", err.message);
                }
                fs.writeFile(`/tmp/filename`, data.Body, function(err){
                    if(err)
                        console.log(err.code, "-", err.message);           
                    }); 
            });
            mp3Duration(`/tmp/filename`, function (err, duration) {
                if (err) return console.log(err.message);
                console.log('Your file is ' + duration + ' seconds long');
            });    

【问题讨论】:

标签: javascript node.js amazon-web-services amazon-s3 aws-lambda


【解决方案1】:

问题是您试图在文件写入临时目录之前读取文件。

s3.getObject({ Bucket: bucketName, Key: `audio/filename` }, function (err, data) {
    if (err) { console.error(err.code, "-", err.message); return; }
    fs.writeFile(`/tmp/filename`, data.Body, function (err) {
        if (err) { console.error(err.code, "-", err.message); return;}

        mp3Duration(`/tmp/filename`, function (err, duration) {
            if (err) { console.error(err.message); return;}
            console.log('Your file is ' + duration + ' seconds long');
        });
    });
});

注意mp3Duration函数被移动到writeFile的回调中

我使用以下 mp3Duration 函数对此进行了测试,它在 Node v15.12.0 上运行良好

const mp3Duration = (fileName, callback) => {
  // do your work to find the duration and finally call the callback
  callback(null, duration)
};

带有 Promise 的 async/await 版本看起来像这样

const mp3Duration = (fileName) => {
  // do your work to find the duration and return a promise. In case of error return Promise.reject();
  return Promise.resolve(duration);
};

try {
    const object = await s3.getObject({ Bucket: bucketName, Key: `audio/filename` }).promise();
    await fs.promises.writeFile(`/tmp/filename`, object.Body);
    const duration = await mp3Duration(`/tmp/app.js`);
    console.log('Your file is ' + duration + ' seconds long');
} catch (err) {
    console.error(err);
}

【讨论】:

  • 感谢您的评论。在上述情况下,它既不返回错误也不返回日志。我的猜测是我需要设置一个流来读取音频文件。它返回了上面和下面的函数日志(不包括在内),但我很好奇为什么不在 mp3 持续时间内。
  • @NoahKanyo 我已经更新了答案中的代码
猜你喜欢
  • 1970-01-01
  • 2019-04-19
  • 2013-03-01
  • 1970-01-01
  • 1970-01-01
  • 2014-02-08
  • 2010-11-17
  • 2020-06-02
  • 1970-01-01
相关资源
最近更新 更多