WAV文件经相位抵消处理后生成文件无声音,求代码逻辑排查
错误1:音频数据读取逻辑完全错误,直接清空了源文件数据段
你写的读取代码逻辑完全颠倒:
// 原错误代码 filein.seek(Wav_header_size); filein.read(); // 仅读取1个字节,没有把数据存入arr数组 filein.write(arr,0, arr.length); // 把刚初始化全为0的arr数组写回源文件,直接覆盖了原音频数据
正确的读取逻辑应该是:
filein = new RandomAccessFile(source, "r"); // 只读模式即可,避免误改源文件 filein.seek(Wav_header_size); filein.read(arr); // 把数据段内容全部读入arr数组 filein.close();
错误2:左右声道拆分逻辑直接提前终止,没有读取任何有效数据
你拆分声道的判断条件完全错误:刚初始化的channelLeft、channelRight数组默认值全为0,第一次循环时channelLeft[j]!=0判定直接不成立,立刻触发break,左右声道数组全程保持全0状态,没有存入任何音频数据。
// 原错误判断逻辑 if(channelLeft.length>j && channelLeft[j]!=0) // 刚初始化的channelLeft[j]是0,直接不成立 channelLeft[j] = shortAudioArray[i]; else break;
正确的拆分逻辑不需要判断声道数组当前值是否为0,只要下标不越界就赋值:
for(int i=0, j=0; i< shortAudioArray.length && j < channelLeft.length;i+=2, ++j){ channelLeft[j] = shortAudioArray[i]; channelRight[j] = shortAudioArray[i+1]; }
错误3:声道合并逻辑同样存在提前终止的问题
合并时的判断data1[i]!=0和data2[i]!=0完全多余,只要音频中出现静音帧(采样值为0)就会直接break,停止写入后续所有音频数据。哪怕前面拆分拿到了有效数据,到这一步也大概率只写入了前几个采样,后面全是0。
额外注意事项
如果你的原音频左右声道内容完全一致,将其中一个声道取反后,在单声道播放设备、或者播放器开启了单声道混音的场景下,两个声道的采样值相加会完全抵消,也会出现无声音的情况,这是相位抵消的正常效果,但你当前的问题核心是前三个代码bug导致音频数据全为0。
内容的提问来源于stack exchange,提问作者Fc0001
相关产品推荐
相关产品推荐

