Spieldauer von mp3-Dateien

Anfängerfragen zum Programmieren mit PureBasic.
nordwolf
Beiträge: 4
Registriert: 26.03.2008 22:13
Wohnort: Hannover

Spieldauer von mp3-Dateien

Beitrag von nordwolf »

Ich habe in Google und den PureBoard-Foren Hinweise gefunden, leider nicht verstanden, wie ich (z.B. in der Mitte des folgenden Codes) die Spieldauer von MP3-Dateien erhalte ??? Für Hilfe danke vorab !

File$ = "H:\Pop-1990-1999\Abba - People Need Love.mp3"
Pattern$ = "Alle Dateien (*.*)|*.*"
Pattern = 0
File$ = OpenFileRequester("Bitte Datei zum Laden auswählen", File$, Pattern$, Pattern)
Groesse = FileSize(File$)

; Spieldauer = ???

Debug File$
Debug "Dateigröße: " + Str(Groesse)
Debug "Spieldauer: " + Str(Spieldauer)
End
Benutzeravatar
ZeHa
Beiträge: 4760
Registriert: 15.09.2004 23:57
Wohnort: Friedrichshafen
Kontaktdaten:

Beitrag von ZeHa »

Naja das hängt vom mp3 ab. Manche mp3s haben eine variable Bitrate, da mußt Du jeden einzelnen Abschnitt auslesen und dessen Bitrate zur Berechnung herziehen und alles aufsummieren.

Es gibt aber auch mp3s mit konstanter Bitrate, da reicht es, den ersten Abschnitt auszulesen und dann die Bitrate mit der Dateigröße zu verrechnen (abzüglich solchen Dingen wie Header und ID3-Tags). Das Problem ist nur, daß man das mit der variablen Bitrate erst weiß, wenn man sich alle Abschnitte angeschaut hat, von daher mußt Du so oder so erstmal alle anschauen.

Such Dir einfach mal eine Beschreibung des mp3-Formats, z.B. auf www.wotsit.org
Bild     Bild

ZeHa hat bisher kein Danke erhalten.
Klicke hier, wenn Du wissen möchtest, woran ihm das vorbeigeht.
Benutzeravatar
ZeHa
Beiträge: 4760
Registriert: 15.09.2004 23:57
Wohnort: Friedrichshafen
Kontaktdaten:

Beitrag von ZeHa »

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];
    }
}
Bild     Bild

ZeHa hat bisher kein Danke erhalten.
Klicke hier, wenn Du wissen möchtest, woran ihm das vorbeigeht.
Benutzeravatar
ZeHa
Beiträge: 4760
Registriert: 15.09.2004 23:57
Wohnort: Friedrichshafen
Kontaktdaten:

Beitrag von ZeHa »

Das hier ist eigentlich eine gute Beschreibung des Formats, die hab ich damals auch genommen: http://www.wotsit.org/getfile.asp?file= ... =261710487
Bild     Bild

ZeHa hat bisher kein Danke erhalten.
Klicke hier, wenn Du wissen möchtest, woran ihm das vorbeigeht.
Antworten