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
相关产品推荐
相关产品推荐

