提取视频中的音频 NodeJS

0 阅读1分钟

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打包到代码中,不需要在服务端再进行安装

拷贝到项目下后的调用示例

拷贝到项目下后的目录结构