为何我的Wave文件多路交错函数无法输出正确Wav文件?
WAV多路交错转译后输出异常问题
我用JavaScript的Wavefile库,把实现WAV文件数据多路交错的Python函数转成了JS版本。现在函数能完成交错操作,但输出的WAV文件不正确。
我的JavaScript代码
function load_to_buffer_arrays(list_of_files) { const output_data = []; const raw_data_array = []; const num_files = list_of_files.length; for (let i = 0; i < num_files; i++) { const file = list_of_files[i]; try { const buffer = fs.readFileSync(file); const wav_temp = new WaveFile(buffer); raw_data_array.push(wav_temp.getSamples(false, Int16Array)); } catch (err) { console.error(err); } } const num_samples = raw_data_array[0].length; for (let j = 0; j < num_samples; j++) { for (let i = 0; i < num_files; i++) { let sample = raw_data_array[i][j]; output_data.push(sample); } } return output_data; }
原Python代码
def load_to_buffer_arrays(list_of_files): """Load files to buffer arrays and interleave the data into one single entity and pass it back""" raw_data_array = [] for i, file in enumerate(list_of_files): sound_file = AudioSegment.from_file(file) sound_samples = sound_file.get_array_of_samples() raw_data_array.append(sound_samples) output_data = [] number_of_files = len(list_of_files) length_of_one_raw_data = len(raw_data_array[0]) for i in range(0, length_of_one_raw_data): for j in range(0,number_of_files): sample = raw_data_array[j][i] output_data.append(sample) return output_data
问题表现
预期输出是符合规范的多轨交错WAV文件,实际输出的文件无法正常解析或播放。
问题原因及解决方法
样本格式处理差异
Python的AudioSegment.get_array_of_samples()返回单声道连续样本数组,而Wavefile的getSamples(false, Int16Array)在interleaved为false时,返回的是按声道分离的二维数组(比如双声道会返回[左声道数组, 右声道数组])。你的代码直接将这个二维数组存入raw_data_array,导致后续交错逻辑完全错误。修复步骤
- 确保输入WAV为单声道,或提取单个声道样本:
// 修改样本提取部分 const samples = wav_temp.getSamples(false, Int16Array); // 取第一个声道的样本(适配单声道输入) raw_data_array.push(samples[0]); - 生成输出WAV时需正确设置文件参数,不能仅返回交错数组:
// 在函数末尾添加WAV生成逻辑 const outputWav = new WaveFile(); // 声道数等于输入文件数,采样率、位深与输入一致 outputWav.fromScratch(num_files, wav_temp.fmt.sampleRate, '16', output_data); // 写入输出文件 fs.writeFileSync('output.wav', outputWav.toBuffer());
- 确保输入WAV为单声道,或提取单个声道样本:
额外注意事项
- 所有输入WAV的采样率、位深必须一致,否则交错后文件会播放异常
- 若某文件读取失败,后续逻辑基于
raw_data_array[0]处理会引发索引错误,建议读取失败时直接终止流程
内容的提问来源于stack exchange,提问作者Edwin Tieu
相关产品推荐
相关产品推荐

