1、环境准备与安装
- 安装Node.js
确保系统已安装 Node.js(建议版本 ≥ v14),可通过node -v
验证安装,这里不做详细说明。 - 新建main.js文件
- 安装依赖
yarn add fluent-ffmpeg // ffmpeg的nodejs调用库
yarn add ffmpeg-static // ffmpeg-static静态版本库,fluent-ffmpeg的作用就是调用fluent-static
2、代码实现
const ffmpegPath = require("ffmpeg-static");
const ffmpeg = require("fluent-ffmpeg");
ffmpeg.setFfmpegPath(ffmpegPath);
let totalTime = 0;
ffmpeg("视频路径")
.output("output.mp3") // 输入文件路径及名称
.noVideo() // 关键参数:去除视频流
.on("start", cmd => console.log("命令:", cmd)) // 命令启动
.on("codecData", data => {
// 提取总时长(格式:HH:MM:SS)
const duration = data.duration;
const parts = duration.split(":").map(Number);
totalTime = parts[0] * 3600 + parts[1] * 60 + parts[2]; // 转换为秒
})
.on("progress", progress => {
const current = progress.timemark.split(":").map(Number);
const currentSeconds = current[0] * 3600 + current[1] * 60 + current[2];
const percent = (currentSeconds / totalTime) * 100 || 0; // 防止除以零
console.log(`进度:${(percent < 0 ? 0 : percent).toFixed(2)}%`); // 这里有个问题,第一次读取到的totalTime是小于0的值,需要做下判断
}) // 实时进度
.on("end", () => console.log("音频提取完成"))
.on("error", err => console.error("错误:", err))
.run();
3、优化
- ffmpeg有两种版本,一种是代码中使用的静态版本,一种是常规可执行文件的版本(这里不做介绍)
- 静态版本中progress事件的回调参数中没有进度的属性,所以需要像代码中这样进行手动计算
- 安装好的fluent-ffmpeg可以拷贝到项目目录下,好处是,可以直接将fluent-ffmpeg打包到代码中,不需要在服务端再进行安装
拷贝到项目下后的调用示例
拷贝到项目下后的目录结构