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

JavaScript音频多段分割遇NaN错误:仅生成单个文件求助

问题分析与修复方案

核心错误点

  • 错误获取音频时长:multiple_split方法中直接调用this.audio.duration()是错误的,这个方法并非获取真实音频时长的正确路径。你的类里已经实现了get_duration()异步方法,它通过ffprobe正确读取元数据中的时长,而this.audio.duration()大概率返回NaN或未定义值,导致后续total_sec、num_splits计算全部出错。
  • 时间单位混淆:get_duration()返回的时长单位是秒(ffprobe返回的metadata.format.duration为秒级浮点数),但代码中错误地将其乘以0.001,把时长缩小了1000倍,直接导致分割逻辑完全混乱。

修复后的代码

class Audio {
    constructor(output_folder, input_filepath) {
        if (!fs.existsSync(input_filepath) || !fs.statSync(input_filepath).isFile()) {
            throw new Error('Invalid input file');
        }
        this.input_filepath = input_filepath;
        this.input_filename = this.getInputFilename(input_filepath);
        this.output_folder = output_folder;
        this.audio = ffmpeg(input_filepath);
    }

    get_duration() {
        return new Promise((resolve, reject) => {
            this.audio.ffprobe((err, metadata) => {
                if (err) {
                    reject(err);
                } else {
                    resolve(metadata.format.duration);
                }
            });
        });
    }

    async multiple_split(sec_per_split) {
        // 调用异步方法获取真实音频时长(单位:秒)
        const total_duration = await this.get_duration();
        // 直接计算总秒数,无需额外转换
        const total_sec = Math.ceil(total_duration);
        const num_splits = Math.ceil(total_sec / sec_per_split);
        console.log(`Total duration: ${total_duration}s`);
        console.log(`Total seconds: ${total_sec}`);
        console.log(`Seconds per split: ${sec_per_split}`);
        console.log(`Number of splits: ${num_splits}`);
        
        for (let i = 0; i < num_splits; i++) {
            const start_sec = i * sec_per_split;
            // 确保结束时间不超过音频实际总时长
            const end_sec = Math.min(start_sec + sec_per_split, total_sec);
            console.log(`Split ${i}: ${start_sec} - ${end_sec}`);
            const split_filename = `${start_sec}_${this.input_filename}`;
            // 根据single_split方法的参数要求调整单位:如果是毫秒则乘以1000,秒则直接传入
            await this.single_split(start_sec, end_sec, split_filename);
        }
    }
}

额外注意事项

  • 确认single_split方法的参数单位:如果它要求起始/结束时间为毫秒,需将start_sec和end_sec乘以1000;如果是秒则直接传入,避免单位错误导致分割失败。
  • 检查getInputFilename方法的实现,确保能从文件路径中正确提取文件名,避免生成的分割文件路径错误。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.22 21:57:30