ファイルを再生するためにjavax.sound.sampled
とを使用しています。オーディオ入力ストリームを分析して、曲の開始時と終了時を判断しようとしています (MP3 の最初と最後のオーディオ レベルに基づいて)。4 分の曲の実際の音楽は 3 分 55 秒しかなく、残りは無音である可能性があるため、これを判断しています。JLayer
MP3
ストリーム内のゼロ以外の最初と最後のバイトを見つけることで、この情報を特定できると思いました。
問題:問題は、バッファ サイズを調整すると、ゼロ以外の最初のバイトの位置が変わることです。これはなぜですか?バッファサイズに関係なく一定のままであるべきではありませんか?
たとえば、バッファ サイズが 16 の場合、startFrame は 17 番目のバイトに対応します。バッファ サイズが 64 の場合、startFrame は 65 番目のバイトに対応します。
コードは次のとおりです。
byte[] buffer;
int pos = 0;
short silenceThreshold = 1;
startFrame = 0;
endFrame = -1;
boolean startFrameSet = false;
buffer = new byte[16];
byte prevVal = 0;
for (int n = 0; n != -1; n = audioInputStream.read(buffer, 0,
buffer.length)) {
for (int i = 0; i < buffer.length; i++) {
if (buffer[i] >= silenceThreshold || buffer[i] <= -silenceThreshold) {
// Is not silent
if (!startFrameSet) {
startFrame = (pos * buffer.length) + i;
startFrameSet = true;
}
} else {
// Silence
// If the previous value is > 0 or < 0, set endFrame
if (prevVal >= silenceThreshold || prevVal <= silenceThreshold) {
endFrame = (pos * buffer.length) + i;
}
}
prevVal = buffer[i];
}
pos++;
}
//If last byte is not within silence threshold (song doesn't end in silence).
if (prevVal >= silenceThreshold || prevVal <= silenceThreshold) {
// last frame is not silent
endFrame = -1;
}
オーディオ入力ストリームとオーディオが一般的にどのように機能するかを誤解していると思います。