我正在尝试混合两个WAV文件。
WAV文件可作为字节数组使用,我正在使用下面的代码来混合两者。
byte[] byte1 , byte[] byte2
// 44 is header of wav file
for( int i = 44 ; i < byte1.length ; i++){
byte1[i] = byte1[i] + byte2[i];
}
上面的代码大部分有效。但是,当结果超过最大波(16位音频文件)时,就会产生噪音。如何规范混合声音?
最佳答案
首先,如果确实是16位音频,则逐字节添加音频是行不通的。其他人对此发表了评论。您可以在这里看到我的答案,以了解如何处理此问题。
using Android's AudioTrack to combine bytes of sound samples produces noise
其次,要“标准化”它,您必须先找到峰,然后将所有结果缩放到该值。这意味着两个循环:一个循环找到“峰值”,另一个循环添加值,缩放到新的峰值。像这样:
//this is the raw audio data -- no header
short[] audioData1 , short[] audioData2
//find the max:
float max = 0;
for( int i = 0 ; i < audioData1.length ; i++) {
if( Math.abs( audioData1[i] + audioData2[i] ) > max )
max = Math.abs( audioData1[i] + audioData2[i] );
}
//now find the result, with scaling:
for( int i = 0 ; i < audioData1.length ; i++) {
audioData1[i] = Math.Round(Short.MAX_VALUE * ( audioData1[i] + audioData2[i] ) / max) ;
}
//normalized result in audioData1