Ich habe sowas mal für Java geschrieben, vielleicht bringt Dir das ja was. Dennoch empfehle ich Dir mal die mp3-Format-Spezifikation anzuschauen, einfach damit Du weißt, wie das alles aufgebaut ist.
Code: Alles auswählen
public class Mp3Tools
{
private static final int[] bitRatesV1L1 = {0, 32, 64, 96,128,160,192,224,256,288,320,352,384,416,448};
private static final int[] bitRatesV1L2 = {0, 32, 48, 56, 64, 80, 93,112,128,160,192,224,256,320,384};
private static final int[] bitRatesV1L3 = {0, 32, 40, 48, 56, 64, 80, 96,112,128,160,192,224,256,320};
private static final int[] bitRatesV2L1 = {0, 32, 48, 56, 64, 80, 96,112,128,114,160,176,192,224,256};
private static final int[] bitRatesV2L2 = {0, 8, 16, 24, 32, 40, 48, 56, 64, 80, 96,112,128,114,160};
private static final int[] bitRatesV2L3 = {0, 8, 16, 24, 32, 40, 48, 56, 64, 80, 96,112,128,114,160};
private static final int[][] bitRatesV1 = {bitRatesV1L1, bitRatesV1L2, bitRatesV1L3};
private static final int[][] bitRatesV2 = {bitRatesV2L1, bitRatesV2L2, bitRatesV2L3};
private static final int[][][] bitRates = {bitRatesV1, bitRatesV2};
// ---
private static final int[] sampleRates0 = {11025, 12000, 8000};
private static final int[] sampleRates2 = {22050, 24000, 16000};
private static final int[] sampleRates3 = {44100, 48000, 32000};
private static final int[][] sampleRates = {sampleRates0, null, sampleRates2, sampleRates3};
// ---
/**
* Returns the length of an mp3 file in milliseconds
*/
public static long getMp3Length(InputStream inStream)
throws IOException
{
float length = -1;
int b = 0;
int c = 0;
@SuppressWarnings("unused")
int d = 0;
while(b > -1)
{
b = inStream.read();
if (b == 0xFF)
{
b = inStream.read();
if ((b & 0xE0) == 0xE0)
{
c = inStream.read();
d = inStream.read();
int mpegVersion = (b & 0x18) >> 3;
int mpegLayer = (b & 0x06) >> 1;
int bitrateIndex = (c & 0xF0) >> 4;
int samplerateIndex = (c & 0x0C) >> 2;
int padding = (c & 0x02) >> 1;
/*
if (mpegVersion == 1 || mpegLayer == 0 || bitrateIndex == 0x0F || samplerateIndex == 0x03)
continue;
*/
int bitrate = getMp3Bitrate(mpegVersion, mpegLayer, bitrateIndex);
int samplerate = getMp3Samplerate(mpegVersion, samplerateIndex);
int frameSize = 144 * (bitrate * 1000) / samplerate + padding;
inStream.skip(frameSize - 4);
/*
System.out.println("mpegVersion = " + mpegVersion);
System.out.println("mpegLayer = " + mpegLayer);
System.out.println("bitrateIndex = " + bitrateIndex + "\t -> " + bitrate);
System.out.println("samplerateIndex = " + samplerateIndex + "\t -> " + samplerate);
System.out.println("padding = " + padding);
System.out.println("------------------------------------");
*/
length += frameSize / (bitrate / 8);
}
}
}
return (long)length;
}
private static int getMp3Bitrate(int mpegVersion, int mpegLayer, int bitrateIndex)
{
switch(mpegVersion)
{
case 0: mpegVersion = 1; break;
case 2: mpegVersion = 1; break;
case 3: mpegVersion = 0; break;
}
mpegLayer = 3 - mpegLayer;
return bitRates[mpegVersion][mpegLayer][bitrateIndex];
}
private static int getMp3Samplerate(int mpegVersion, int samplerateIndex)
{
return sampleRates[mpegVersion][samplerateIndex];
}
}