私は実際read
にAudioInputStream
. 以下のプログラムは、取得したバイト配列を出力するだけですが、バイトが実際にサンプルであるかどうかは実際にはわかりません。したがって、バイト配列は audio waveです。
File fileIn;
AudioInputStream audio_in;
byte[] audioBytes;
int numBytesRead;
int numFramesRead;
int numBytes;
int totalFramesRead;
int bytesPerFrame;
try {
audio_in = AudioSystem.getAudioInputStream(fileIn);
bytesPerFrame = audio_in.getFormat().getFrameSize();
if (bytesPerFrame == AudioSystem.NOT_SPECIFIED) {
bytesPerFrame = 1;
}
numBytes = 1024 * bytesPerFrame;
audioBytes = new byte[numBytes];
try {
numBytesRead = 0;
numFramesRead = 0;
} catch (Exception ex) {
System.out.println("Something went completely wrong");
}
} catch (Exception e) {
System.out.println("Something went completely wrong");
}
そして他の部分では、これでいくつかのバイトを読みました:
try {
if ((numBytesRead = audio_in.read(audioBytes)) != -1) {
numFramesRead = numBytesRead / bytesPerFrame;
totalFramesRead += numFramesRead;
}
} catch (Exception e) {
System.out.println("Had problems reading new content");
}
まず第一に、このコードは私からのものではありません。オーディオファイルを読むのはこれが初めてなので、インターウェブから助けを得ました。(リンクを見つけました: Java - WAV ファイルの読み取り、操作、書き込み、 stackoverflow、誰が知っていたでしょう。
問題は、audioBytes のバイトが何を表しているかということです。ソースが44kHzのステレオなので、どこかに2波が隠れているはずですよね?では、これらのバイトから重要な情報を除外するにはどうすればよいでしょうか?
// 編集
だから私が追加したのはこの機能です:
public short[] Get_Sample() {
if(samplesRead == 1024) {
Read_Buffer();
samplesRead = 4;
} else {
samplesRead = samplesRead + 4;
}
short sample[] = new short[2];
sample[0] = (short)(audioBytes[samplesRead-4] + 256*audioBytes[samplesRead-3]);
sample[1] = (short)(audioBytes[samplesRead-2] + 256*audioBytes[samplesRead-1]);
return sample;
}
ここで、Read_Buffer() は次の 1024 (またはそれ以下) バイトを読み取り、それらを audioBytes にロードします。sample[0] は左側に使用され、sample[1] は右側に使用されます。しかし、この波から得られる波は非常に「うるさい」ように見えるので、まだよくわかりません。(編集: 使用された WAV は実際にはリトルエンディアンのバイト順を使用していたため、計算を変更する必要がありました。)