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

Node.js用fluent-ffmpeg提取静音时间戳并导出CSV/JSON

获取音频静音片段并导出结果的Node.js实现

核心思路

ffmpeg的silencedetect滤镜会将检测结果输出到标准错误流(stderr),所以需要通过监听fluent-ffmpeg的stderr事件捕获这些日志,解析出静音的开始/结束时间,最后过滤出5-7秒的片段并导出为JSON/CSV。

完整代码实现

const ffmpeg = require('fluent-ffmpeg');
const fs = require('fs');
const audioPath = './your-audio-file.mp3'; // 替换为你的音频文件路径

// 存储符合要求的静音片段
const validSilenceSegments = [];

ffmpeg(audioPath)
  .audioFilters('silencedetect=n=-50dB:d=5')
  // 仅做分析,不生成输出文件(Windows系统将/dev/null替换为NUL)
  .output('/dev/null')
  // 监听ffmpeg的标准错误流,捕获silencedetect日志
  .on('stderr', (line) => {
    // 匹配静音开始时间
    const startMatch = line.match(/silence_start: (\d+\.?\d*)/);
    // 匹配静音结束时间和持续时长
    const endMatch = line.match(/silence_end: (\d+\.?\d*) \| silence_duration: (\d+\.?\d*)/);

    if (startMatch) {
      validSilenceSegments.push({ start: parseFloat(startMatch[1]) });
    } else if (endMatch) {
      const latestSegment = validSilenceSegments[validSilenceSegments.length - 1];
      if (latestSegment) {
        latestSegment.end = parseFloat(endMatch[1]);
        latestSegment.duration = parseFloat(endMatch[2]);
        // 过滤掉时长不在5-7秒范围内的片段
        if (latestSegment.duration < 5 || latestSegment.duration > 7) {
          validSilenceSegments.pop();
        }
      }
    }
  })
  // 分析完成后的处理逻辑
  .on('end', () => {
    console.log('符合要求的静音片段:', validSilenceSegments);
    
    // 导出为JSON文件
    fs.writeFileSync('silence-segments.json', JSON.stringify(validSilenceSegments, null, 2));
    console.log('已导出JSON文件:silence-segments.json');

    // 导出为CSV文件
    const csvContent = [
      'start,end,duration',
      ...validSilenceSegments.map(seg => `${seg.start},${seg.end},${seg.duration}`)
    ].join('\n');
    fs.writeFileSync('silence-segments.csv', csvContent);
    console.log('已导出CSV文件:silence-segments.csv');
  })
  // 错误处理
  .on('error', (err) => {
    console.error('分析失败:', err.message);
  })
  .run();

关键细节说明

  • 噪声阈值调整:n=-50dB是静音判断的音量阈值,如果音频存在较多零星噪声,可提高阈值(比如n=-40dB)减少误判;若噪声极小,可降低阈值(比如n=-60dB)提升检测精度。
  • 无输出文件配置:添加.output('/dev/null')是为了让ffmpeg有合法输出目标,避免报错且不生成无用文件,Windows用户需替换为NUL。
  • ffmpeg路径配置:如果系统找不到ffmpeg,需在代码开头添加以下语句指定路径:
    ffmpeg.setFfmpegPath('/path/to/ffmpeg.exe'); // 替换为你的ffmpeg可执行文件路径
    

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.29 09:53:01