You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用Node.js从MP4/MKV视频URL提取所有音轨

从MP4/MKV视频URL提取所有音轨的Node.js实现

核心思路

要批量提取视频中所有音轨,需先通过ffprobe探测视频的音频流数量,再为每个音轨单独设置FFmpeg输出任务,利用-map参数指定提取对应索引的音轨。

修改后的完整代码

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

app.post('/convert', (req, res) => {
  const { inputPath, outputPath } = req.body;

  if (!inputPath || !outputPath) {
    return res.status(400).json({ error: '请求无效,inputPath和outputPath均为必填项。' });
  }

  // 探测视频媒体元数据,获取音轨信息
  ffmpeg.ffprobe(inputPath, (err, metadata) => {
    if (err) {
      console.error('媒体信息探测失败:', err);
      return res.status(500).json({ error: '无法获取视频音轨信息' });
    }

    // 筛选所有音频流
    const audioStreams = metadata.streams.filter(stream => stream.codec_type === 'audio');
    if (audioStreams.length === 0) {
      return res.status(400).json({ error: '视频中未检测到音轨' });
    }

    // 初始化FFmpeg命令实例
    const command = ffmpeg(inputPath);

    // 为每个音轨添加输出任务
    audioStreams.forEach((_, index) => {
      // 生成带音轨编号的输出路径(如output_1.mp3、output_2.mp3)
      const fileExt = outputPath.split('.').pop();
      const trackOutput = outputPath.replace(`.${fileExt}`, `_${index + 1}.${fileExt}`);

      command
        .output(trackOutput)
        .noVideo()
        .format('mp3')
        .outputOptions('-ab', '192k')
        .outputOptions(`-map 0:a:${index}`); // 指定提取第index个音轨
    });

    // 监听任务完成与错误
    command
      .on('end', () => {
        const outputFiles = audioStreams.map((_, i) => {
          const ext = outputPath.split('.').pop();
          return outputPath.replace(`.${ext}`, `_${i + 1}.${ext}`);
        });
        console.log('所有音轨提取完成');
        res.json({ message: '所有音轨提取完成', outputFiles });
      })
      .on('error', (err) => {
        console.error('音轨提取失败:', err);
        res.status(500).json({ error: '音轨提取失败' });
      })
      .run();
  });
});

关键说明

  1. 音轨探测:通过ffmpeg.ffprobe读取视频元数据,筛选出codec_type为audio的流,确定音轨总数。
  2. 多输出配置:遍历每个音轨,为每个音轨单独设置输出路径,并通过-map 0:a:${index}精准指定要提取的音轨(0:a:0代表第1条音轨,0:a:1代表第2条,以此类推)。
  3. 输出路径处理:在原输出路径基础上添加音轨编号,避免文件覆盖。
  4. 转码与复制可选:
    • 如果需要转码为MP3(延续原代码逻辑),保持.format('mp3')和-ab 192k参数。
    • 如果需要无损复制原音轨,删除.format('mp3')和-ab 192k,添加-c:a copy参数,代码片段如下:
      command
        .output(trackOutput)
        .noVideo()
        .outputOptions('-c:a copy') // 直接复制原音频流,无转码
        .outputOptions(`-map 0:a:${index}`);
      

内容的提问来源于stack exchange,提问作者md server

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.16 15:11:59