Nodejs 如何获取音频的总时长?

Nodejs 如何获取音频的总时长?

我用req.file接收上传的音频文件 如何得到音频的总时长? nodejs 能否实现这个问题 还是需要通过外部库来实现?

5 回复

要使用 Node.js 获取音频文件的总时长,通常需要借助一些外部库,因为 Node.js 本身并不直接提供这样的功能。常用的库有 fluent-ffmpegmusicmetadata。下面将分别介绍如何使用这两个库来获取音频文件的时长。

使用 fluent-ffmpeg

fluent-ffmpeg 是一个非常强大的库,可以用来处理音频和视频文件,包括获取音频的时长。

安装 fluent-ffmpeg

首先,你需要安装 fluent-ffmpeg 库:

npm install fluent-ffmpeg

示例代码

假设你已经通过 req.file 接收了上传的音频文件,你可以使用以下代码来获取音频的时长:

const ffmpeg = require('fluent-ffmpeg');
const fs = require('fs');

// 假设 req.file.path 是音频文件的路径
const audioFilePath = req.file.path;

ffmpeg.ffprobe(audioFilePath, (err, metadata) => {
    if (err) {
        console.error('Error:', err);
        return;
    }

    // 获取音频的时长(以秒为单位)
    const duration = metadata.format.duration;
    console.log(`Audio duration: ${duration} seconds`);
});

使用 musicmetadata

如果你只需要处理音频文件而不涉及复杂的视频处理,那么 musicmetadata 可能更适合你。

安装 musicmetadata

首先,你需要安装 musicmetadata 库:

npm install musicmetadata

示例代码

const mm = require('musicmetadata');
const fs = require('fs');

// 假设 req.file.path 是音频文件的路径
const audioFilePath = req.file.path;

const parser = mm(fs.createReadStream(audioFilePath), (err, metadata) => {
    if (err) {
        console.error('Error:', err);
        return;
    }

    // 获取音频的时长(以毫秒为单位)
    const duration = metadata.duration * 1000; // 将秒转换为毫秒
    console.log(`Audio duration: ${duration} milliseconds`);
});

总结

以上两种方法都可以有效地获取音频文件的时长。fluent-ffmpeg 更强大,适用于更复杂的音频和视频处理任务,而 musicmetadata 则更轻量级,适合仅需获取元数据的情况。根据你的具体需求选择合适的库。


找个相关的库才行。http 协议默认不提供音频时长信息。

libmp3lame,libfaac,libvorbis

这三个库装了么?

要在 Node.js 中获取音频文件的总时长,通常需要借助外部库,因为 Node.js 本身并不具备直接处理音频格式的能力。常用的库有 ffmpegffmetadata。这里我们将使用 fluent-ffmpeg 库,它是一个基于 ffmpeg 的封装库,能够简化对音频和视频的处理。

首先,你需要安装 fluent-ffmpegffmpeg。你可以通过以下命令全局安装 ffmpeg

sudo apt-get install ffmpeg  # 对于 Debian/Ubuntu 系统
brew install ffmpeg          # 对于 macOS 用户

然后,在你的项目中安装 fluent-ffmpeg

npm install fluent-ffmpeg

接下来,你可以使用 fluent-ffmpeg 来获取音频文件的时长。假设你已经通过中间件(例如 multer)将文件保存到服务器上的某个路径。

以下是一个简单的示例代码:

const fs = require('fs');
const path = require('path');
const ffmpeg = require('fluent-ffmpeg');

// 设置 ffmpeg 的路径,如果你安装了全局 ffmpeg 可以省略这一步
ffmpeg.setFfmpegPath('/path/to/ffmpeg');

function getAudioDuration(filePath) {
    return new Promise((resolve, reject) => {
        ffmpeg.ffprobe(filePath, (err, metadata) => {
            if (err) {
                reject(err);
            } else {
                const duration = metadata.format.duration;
                resolve(duration);
            }
        });
    });
}

// 使用 req.file.path 获取上传的音频文件路径
const audioFilePath = req.file.path;

getAudioDuration(audioFilePath)
    .then(duration => {
        console.log(`音频时长为: ${duration} 秒`);
    })
    .catch(err => {
        console.error('获取音频时长失败:', err);
    });

上述代码定义了一个 getAudioDuration 函数,该函数接受一个文件路径作为参数,并返回该音频文件的时长。通过 ffmpeg.ffprobe 方法,我们可以快速地获取音频文件的元数据,其中包括音频的时长。这种方法适用于大多数常见的音频格式,如 MP3、WAV 等。

回到顶部