同時サウンドが必要なアンドロイドオーディオアプリを開発しています。2つのオーディオバッファを混在させたときのクリック/歪み
私は2つのサウンドバッファを組み合わせようとしており、大きな振幅で歪みを得ています。
for(int i=0;i<data2.length;i+=2)
{
short buf1a = data[i+1];
short buf2a = data[i];
buf1a = (short)((buf1a & 0xff) << 8);
buf2a = (short) (buf2a & 0xff);
short buf1b = data2[i+1];
short buf2b = data2[i];
buf1b = (short) ((buf1b & 0xff) << 8);
buf2b = (short) (buf2b & 0xff);
short buf1c = (short) (buf1a + buf1b);
short buf2c = (short) (buf2a + buf2b);
short res = (short) (buf1c + buf2c);
int res2 = res/2;
res = (short)res2;
data3[i]=(byte)res;
data3[i+1]=(byte)(res>>8);
}
バッファを使用して再生されます:: これは私がやっているものですJava: Mixing two WAV files without introducing noise:
AudioTrack at = new AudioTrack(STREAM_MUSIC,44100,CHANNEL_OUT_MONO,ENCODING_PCM_16BIT,dataSize,MODE_STATIC);
at.write(data3,0,data3.length);
int frames = data3.length/2; //2 bytes per frame.
Log.d(TAG,"this is data length: "+data3.length);
Log.d(TAG,"this is assumed frame number:"+frames);
at.setLoopPoints(0,frames,3);
at.play();
私はほぼ正確にここで説明する手順に従いました。
バッファdataとdata2には、ミックスするwavファイルのデータが含まれています。 AudioTrackを使って自分で演奏するときは、音が綺麗です。また、「高振幅クリック」とは別に、ミックスはうまく聞こえます。
私は、短い値が最大振幅では大きすぎると仮定しましたが、私は2で割るので、理由はわかりません。
更新:私はwavにミックスを出力し、それをAudacityで見ました。 下の一番上の波形は、クリックとのミックスです。下の波形は、Audacityが2つのwavをミックスし、クリックがない場合です。波形がグラフの '屋根'/'床'に接触すると、ミックスのクリックが発生します。 私のミックスは、これらの場所でより広いピークを持つように見えます。まだこれを解決していない。 更新2: これは、問題領域が近づいているように見えます。それはAudacityバージョンのように最高/最低値(床/屋根)にカットされますが、私のバージョンでは、それは反対側にジャンプし、そこのカーブを「終了」しているようです。
ありがとう!はい、そのソリューションははるかに良いです - 私はあなたのソリューションに私のコードで今変更し、素晴らしい動作します。 :) – gnyrfta