Java8にて、2つのWavファイルを並列に合成したいと考え色々調べたところ、データを足すと合成されるとあったので、単純に足してみたところ、一応ファイルは合成されたのですが、音が重なった部分に「サー」というノイズが乗ってしまい、きれいな合成がされません。
原因は何でしょうか。
Wavファイルは2つとも
frameSize:2byte
Fs:11025.0Hz
16bit
1ch
LittleEndian
SignedPCM
です。
宜しくお願い致します。
java
1import java.io.ByteArrayInputStream; 2import java.io.File; 3import java.io.InputStream; 4 5import javax.sound.sampled.AudioFileFormat; 6import javax.sound.sampled.AudioFormat; 7import javax.sound.sampled.AudioInputStream; 8import javax.sound.sampled.AudioSystem; 9 10public class WavMix { 11 12 public static void main(String[] args) throws Exception { 13 14 byte[] data1 = new WavMix().getByte("AAA.wav"); 15 byte[] data2 = new WavMix().getByte("BBB.wav"); 16 17 System.out.println("data1.length = " + data1.length); 18 System.out.println("data2.length = " + data2.length); 19 20 int activeLength = data1.length > data2.length ? data1.length : data2.length; 21 22 // 並列合成 23 byte[] data = new byte[activeLength]; 24 for (int i = 0; i < activeLength; i = i + 2) { 25 if (data1.length > i && data2.length > i) { 26 short n1 = (short) ((data1[i + 1] << 8) + data1[i]); 27 short n2 = (short) ((data2[i + 1] << 8) + data2[i]); 28 29 // 足す 30 short n = (short) ((n1 + n2) * 0.5); 31 32 String hex = String.format("%04x", n); 33 byte z1 = (byte) Integer.parseInt(hex.substring(0, 2), 16); 34 byte z2 = (byte) Integer.parseInt(hex.substring(2, 4), 16); 35 data[i] = z2; 36 data[i + 1] = z1; 37 } else if (data1.length > i) { 38 data[i] = data1[i]; 39 data[i + 1] = data1[i + 1]; 40 } else { 41 data[i] = data2[i]; 42 data[i + 1] = data2[i + 1]; 43 } 44 } 45 46 // 書き出し 47 AudioFormat af = new AudioFormat(22050, 16, 1, true, false); 48 InputStream in = new ByteArrayInputStream(data); 49 AudioInputStream newAis = new AudioInputStream(in, af, data.length); 50 File soundFile = new File("newFile.wav"); 51 AudioSystem.write(newAis, AudioFileFormat.Type.WAVE, soundFile); 52 53 } 54 55 // データ取得 56 byte[] getByte(String file) throws Exception { 57 AudioInputStream ais = AudioSystem.getAudioInputStream(new File(file)); 58 byte[] data = new byte[ais.available()]; 59 ais.read(data); 60 ais.close(); 61 format(ais); 62 return data; 63 64 } 65 66 // ファイルフォーマット確認 67 void format(AudioInputStream ais) { 68 AudioFormat format = ais.getFormat(); 69 StringBuilder sb = new StringBuilder(); 70 sb.append("[AudioFormat] frameSize:" + format.getFrameSize() + "byte"); 71 sb.append(" Fs:" + format.getSampleRate() + "Hz"); 72 sb.append(" " + format.getSampleSizeInBits() + "bit"); 73 sb.append(" " + format.getChannels() + "ch"); 74 if (format.isBigEndian()) { 75 sb.append(" BigEndian"); 76 } else { 77 sb.append(" LittleEndian"); 78 } 79 if (format.getEncoding() == AudioFormat.Encoding.PCM_SIGNED) { 80 sb.append(" SignedPCM"); 81 } else if (format.getEncoding() == AudioFormat.Encoding.PCM_UNSIGNED) { 82 sb.append(" UnsignedPCM"); 83 } else { 84 sb.append(" NoPCM"); 85 } 86 System.out.println(sb.toString()); 87 } 88 89} 90
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2018/01/03 03:06