hi guy, currently I'm developing the application that similar like Ringdroid where i need to retrieve the sample rate, bitrate and others information from MP3 file. can anyone can explain the coding below...
size = (int)input.length();
FileInputStream stream = new FileInputStream(input);
int pos = 0;
int offset = 0;
byte[] buffer = new byte[12];
while (pos < size) {
while(offset < 12) {
int data = stream.read(buffer, 0, buffer.length);
offset += data;
size -= 12;
}
int bufferOffset = 0;
while (bufferOffset < 12 && buffer[bufferOffset] != -1){
bufferOffset++;
}
if (bufferOffset > 0) {
for (int i = 0; i < 12 - bufferOffset; i++)
buffer = buffer[bufferOffset + i];
pos += bufferOffset;
offset = 12 - bufferOffset;
continue;
}
// Check for MPEG 1 Layer III or MPEG 2 Layer III codes
int version = 0;
if (buffer[1] == -6 || buffer[1] == -5) {
version = 1;
} else if (buffer[1] == -14 || buffer[1] == -13) {
version = 2;
} else {
bufferOffset = 1;
for (int i = 0; i < 12 - bufferOffset; i++)
buffer = buffer[bufferOffset + i];
pos += bufferOffset;
offset = 12 - bufferOffset;
continue;
}
int bitRate;
int sample;
if (version == 1) {
// MPEG 1 Layer III
bitRate = BITRATES_MPEG1_Layer3[(buffer[2] & 0xF0) >> 4];
sample = SAMPLERATES_MPEG1_Layer3[(buffer[2] & 0x0C) >> 2];
} else {
// MPEG 2 Layer III
bitRate = BITRATES_MPEG2_Layer3[(buffer[2] & 0xF0) >> 4];
sample = SAMPLERATES_MPEG2_Layer3[(buffer[2] & 0x0C) >> 2];
}
if (bitRate == 0 || sample == 0) {
bufferOffset = 2;
for (int i = 0; i < 12 - bufferOffset; i++)
buffer = buffer[bufferOffset + i];
pos += bufferOffset;
offset = 12 - bufferOffset;
continue;
}
SampleRate = sample;
int padding = (buffer[2] & 2) >> 1;
int frameLen = 144 * bitRate * 1000 / sample + padding;
int gain;
if ((buffer[3] & 0xC0) == 0xC0) {
// 1 channel
Channels = 1;
if (version == 1) {
gain = ((buffer[10] & 0x01) << 7) +
((buffer[11] & 0xFE) >> 1);
} else {
gain = ((buffer[9] & 0x03) << 6) +
((buffer[10] & 0xFC) >> 2);
}
} else {
// 2 channels
Channels = 2;
if (version == 1) {
gain = ((buffer[9] & 0x7F) << 1) +
((buffer[10] & 0x80) >> 7);
} else {
gain = 0;
}
}
bitrateSum = bitrateSum + bitRate;
FrameOffsets[Frames] = pos;
FrameLens[Frames] = frameLen;
FrameGains[Frames] = gain;
if (gain < MinGain)
MinGain = gain;
if (gain > MaxGain)
MaxGain = gain;
Frames++;
if (Frames == MaxFrames) {
AvgBitRate = bitrateSum / Frames;
int totalFramesGuess = ((size / AvgBitRate) * sample) / 144000;
int newMaxFrames = totalFramesGuess * 11 / 10;
if (newMaxFrames < MaxFrames * 2)
newMaxFrames = MaxFrames * 2;
int[] newOffsets = new int[newMaxFrames];
int[] newLens = new int[newMaxFrames];
int[] newGains = new int[newMaxFrames];
for (int i = 0; i < Frames; i++) {
newOffsets = FrameOffsets;
newLens = FrameLens;
newGains = FrameGains;
}
FrameOffsets = newOffsets;
FrameLens = newLens;
FrameGains = newGains;
MaxFrames = newMaxFrames;
}
stream.skip(frameLen - 12);
pos += frameLen;
offset = 0;
}
if (Frames > 0){
AvgBitRate = bitrateSum / Frames;
}
else{
AvgBitRate = 0;
}
}
size = (int)input.length();
FileInputStream stream = new FileInputStream(input);
int pos = 0;
int offset = 0;
byte[] buffer = new byte[12];
while (pos < size) {
while(offset < 12) {
int data = stream.read(buffer, 0, buffer.length);
offset += data;
size -= 12;
}
int bufferOffset = 0;
while (bufferOffset < 12 && buffer[bufferOffset] != -1){
bufferOffset++;
}
if (bufferOffset > 0) {
for (int i = 0; i < 12 - bufferOffset; i++)
buffer = buffer[bufferOffset + i];
pos += bufferOffset;
offset = 12 - bufferOffset;
continue;
}
// Check for MPEG 1 Layer III or MPEG 2 Layer III codes
int version = 0;
if (buffer[1] == -6 || buffer[1] == -5) {
version = 1;
} else if (buffer[1] == -14 || buffer[1] == -13) {
version = 2;
} else {
bufferOffset = 1;
for (int i = 0; i < 12 - bufferOffset; i++)
buffer = buffer[bufferOffset + i];
pos += bufferOffset;
offset = 12 - bufferOffset;
continue;
}
int bitRate;
int sample;
if (version == 1) {
// MPEG 1 Layer III
bitRate = BITRATES_MPEG1_Layer3[(buffer[2] & 0xF0) >> 4];
sample = SAMPLERATES_MPEG1_Layer3[(buffer[2] & 0x0C) >> 2];
} else {
// MPEG 2 Layer III
bitRate = BITRATES_MPEG2_Layer3[(buffer[2] & 0xF0) >> 4];
sample = SAMPLERATES_MPEG2_Layer3[(buffer[2] & 0x0C) >> 2];
}
if (bitRate == 0 || sample == 0) {
bufferOffset = 2;
for (int i = 0; i < 12 - bufferOffset; i++)
buffer = buffer[bufferOffset + i];
pos += bufferOffset;
offset = 12 - bufferOffset;
continue;
}
SampleRate = sample;
int padding = (buffer[2] & 2) >> 1;
int frameLen = 144 * bitRate * 1000 / sample + padding;
int gain;
if ((buffer[3] & 0xC0) == 0xC0) {
// 1 channel
Channels = 1;
if (version == 1) {
gain = ((buffer[10] & 0x01) << 7) +
((buffer[11] & 0xFE) >> 1);
} else {
gain = ((buffer[9] & 0x03) << 6) +
((buffer[10] & 0xFC) >> 2);
}
} else {
// 2 channels
Channels = 2;
if (version == 1) {
gain = ((buffer[9] & 0x7F) << 1) +
((buffer[10] & 0x80) >> 7);
} else {
gain = 0;
}
}
bitrateSum = bitrateSum + bitRate;
FrameOffsets[Frames] = pos;
FrameLens[Frames] = frameLen;
FrameGains[Frames] = gain;
if (gain < MinGain)
MinGain = gain;
if (gain > MaxGain)
MaxGain = gain;
Frames++;
if (Frames == MaxFrames) {
AvgBitRate = bitrateSum / Frames;
int totalFramesGuess = ((size / AvgBitRate) * sample) / 144000;
int newMaxFrames = totalFramesGuess * 11 / 10;
if (newMaxFrames < MaxFrames * 2)
newMaxFrames = MaxFrames * 2;
int[] newOffsets = new int[newMaxFrames];
int[] newLens = new int[newMaxFrames];
int[] newGains = new int[newMaxFrames];
for (int i = 0; i < Frames; i++) {
newOffsets = FrameOffsets;
newLens = FrameLens;
newGains = FrameGains;
}
FrameOffsets = newOffsets;
FrameLens = newLens;
FrameGains = newGains;
MaxFrames = newMaxFrames;
}
stream.skip(frameLen - 12);
pos += frameLen;
offset = 0;
}
if (Frames > 0){
AvgBitRate = bitrateSum / Frames;
}
else{
AvgBitRate = 0;
}
}