# kleine mp3 Lib



## The_S (19. Sep 2006)

Hi, kennt jemand eine kleine mp3 Lib? Muss nur folgendes können:

mp3 abspielen/pausieren/stoppen/länge auslesen
Lautstärke verändern

JMF ist mir dafür ein bisschen zuviel des guten und bei JLayer hab ich bis jetzt nicht fürs pausieren oder Lautstärke verändern gefunden (könnte auch daran liegen, dass die API ziemlich fürn A**** ist und man nirgends richtige Beispiele findet).

Danke für Tipps!


----------



## LoN_Nemesis (6. Okt 2006)

Würde mich auch mal interessieren, ich bräuchte sogar nur Abspielen/Stoppen/Im Loop abspielen von MP3s. Am besten so wenig Code wie möglich, hat jemand ein paar Beispiel Zeilen?


----------



## The_S (6. Okt 2006)

Für Abspielen und Stoppen kannste ja auch JLayer verwenden. Loop kannste damit ja leicht selber bauen. Aber ansonsten hab ich noch nix gefunden und begnüge mich bis jetzt weiterhin mit dem JMF :?


----------



## The_S (28. Nov 2006)

Nachdem mir das JMF jetzt doch zu fehlerhaft ist (z. b. werden manche mp3s erst abgespielt sobald man im Lied spult, wenn ein Titel seit ca. 2 Sekunden abgespielt wird und man blöderweiße auf die Idee kommt einen JFileChooser aufzurufen crashed die komplete VM und zu guter letzt kenne ich niemanden, der es geschafft hat das Cross-Platform JMF mithilfe des Mp3-Plugins von Sun dazu zu bringen mp3s abzuspielen) grabe ich diesen Thread nochmal aus :cry: .

Nachdem es ja scheinbar außer den libs von javazoom (mp3spi und jlayer) keine librarys gibt, mit denen man unter java mp3-Dateien abspielen kann beschätige ich mich seit ein paar Tagen mit diesen beiden. Ich möchte auch wirklich nur die ganz Elementaren Funktionen verwenden wie

- mp3 Datei abspielen (hab ich mit jlayer und mp3spi hinbekommen)
- mp3 Datei stoppen (hab ich nur mit jlayer hinbekommen)
- aktuelle Position auslesen (hab ich nur mit jlayer hinbekommen)
- aktuelle Position setzen (hab ich noch nicht hinbekommen)
- Ausgabelautstärke verändern (hab ich noch nicht hinbekommen)

. Mehr brauch ich gar nicht. Leider ist die Doku der beiden Libs schlichtweg scheiße und gute Tutorials gibt es auch nicht wirklich (zumindest habe ich noch keines gefunden).

Sollte irgendjemand irgendeine Idee haben, bitte teilt euer Wissen mit mir. Ich bin hier schon langsam am verzweifeln ... :cry:

Danke vielmals!


----------



## Jockel (28. Nov 2006)

Hm, zu FMOD gibt es ein paar Java-Bindings, vielleicht solltest du mal da einen Blick drauf werfen.


----------



## The_S (28. Nov 2006)

Jockel hat gesagt.:
			
		

> Hm, zu FMOD gibt es ein paar Java-Bindings, vielleicht solltest du mal da einen Blick drauf werfen.



Was ist FMOD  ?

-----------------------------------------------------------------------

Also ich hab jetzt einen relativ einfache mp3-Player lib geschrieben, die die Libs

- basicplayer3.0.jar
- commons-logging-api.jar
- jl1.0.jar
- mp3spi1.9.4.jar
- tritonus_share.jar

der BasicPlayer API von javazoom benötigt ( http://www.javazoom.net/jlgui/api.html )

Was mir daran nicht gefällt ist, dass der Sound kratzt und manchmal unkontrollierte Fehler geworfen werden bzw. alles mitgeloggt wird und die Konsole verdammt unübersichtlich wird. Deshalb hab ich auch relativ schnell wieder damit aufgehört. Ich kann den Source ja mal hier reinstellen, evtl. hat ja jemand lust da weiter zu machen  . Ist aber weder kommentiert noch sonderlich durchdacht, da am Anfang einfach was zum Testen her sollte  .

*MediaPlayer* (Der eigentliche Player, die anderen Klassen sollen nicht verwendet werden)


```
package smp.player; 

import java.io.File; 
import java.io.IOException; 
import java.util.ArrayList; 
import java.util.Map; 

import javax.sound.sampled.AudioSystem; 
import javax.sound.sampled.UnsupportedAudioFileException; 

import javazoom.jlgui.basicplayer.BasicPlayerException; 

import org.tritonus.share.sampled.file.TAudioFileFormat; 

import smp.exception.MediaPlayerException; 
import smp.listener.MediaPlayerListener; 

public class MediaPlayer implements MediaPlayerListener{ 
    
   private final String MP3 = "mp3"; 
    
   private Mp3Player mp3player = null; 
   private String curplayer = null; 
   private ArrayList<MediaPlayerListener> listener = null; 
    
   private float volume = 0.3F; 
   private long songLength = 0; 
   private long songSize = 0; 
   private long curLength = 0; 
    
   /**
    * Construct a new MediaPlayer
    */
   public MediaPlayer() { 
       
      listener = new ArrayList<MediaPlayerListener>(); 
      mp3player = new Mp3Player(); 
      mp3player.addMediaPlayerListener(this); 
   } 
   
   /**
    * Add a MediaPlayerListener to this MediaPlayer
    * @param mpl - The MediaPlayerListener
    */
   public void addMediaPlayerListener(MediaPlayerListener mpl) { 
      listener.add(mpl); 
   } 
   
   /**
    * Remove a MediaPlayerListener from this MediaPlayer
    * @param mpl - The MediaPlayerListener
    */
   public void removeMediaPlayerListener(MediaPlayerListener mpl) { 
      listener.remove(mpl); 
   } 
    
   /**
    * Notifie the listener, that the song has been finished
    */
   protected void songFinished() { 
       
      for (MediaPlayerListener mpl : listener) { 
         mpl.songEnded(); 
      } 
   } 
   
   /**
    * Play a musicfile. At the moment only mp3 is supported.
    * @param f - The file to play.
    * @throws MediaPlayerException
    * @see play(File f, long startPosition)
    * @see getSongSize(File f)
    */
   public void play(File f) throws MediaPlayerException{ 
      play(f, 0); 
   } 
   
   /**
    * Play a musicfile, starting at the given position.
    * @param f - The file to play.
    * @param startPosition - The start position in microseconds
    * @throws MediaPlayerException
    * @see play(File f)
    * @see getSongSize(File f);
    */
   public void play(File f, long startPosition) throws MediaPlayerException{ 
       
      stop(); 
      if (f.getName().toLowerCase().endsWith(".mp3")) { 
         playMp3(f, startPosition); 
         setVolume(volume);
      } 
   } 
   
   /**
    * Stop the current playback
    * @throws MediaPlayerException
    */
   public void stop() throws MediaPlayerException { 
       
      if (MP3.equals(curplayer)) { 
         try { 
            mp3player.setStopped(true); 
            mp3player.stop(); 
         } 
         catch (BasicPlayerException e) { 
            throw new MediaPlayerException("Can't stop playing mp3 file", e); 
         } 
      } 
      curplayer = null; 
   } 
   
   /**
    * Get the song duration in microseconds
    * @param f - The musicfile to be read
    * @return Song size in microseconds
    * @throws ClassCastException
    * @throws IOException
    * @throws UnsupportedAudioFileException
    */
   public long getSongSize(File f) throws ClassCastException, IOException, UnsupportedAudioFileException { 
      
	  if (f.getName().toLowerCase().endsWith(".mp3")) {
		  Map properties = ((TAudioFileFormat)AudioSystem.getAudioFileFormat(f)).properties(); 
	      songLength = Long.parseLong(properties.get("duration").toString()); 
	      songSize = f.length(); 
	      return songLength; 
	  }
	  return -1;
   } 
   
   /**
    * Set the position to the given microseconds
    * @param position - New position in microseconds
    * @throws MediaPlayerException
    */
   public void setPosition(long position) throws MediaPlayerException { 
       
      try { 
         curLength = position;
         mp3player.setPosition((long)(songSize * ((double)position / (double)songLength))); 
      } 
      catch (BasicPlayerException e) { 
         throw new MediaPlayerException("Can't seek in mp3 file", e); 
      } 
   } 
   
   /**
    * Set the volume
    * @param volume - The volume
    * @throws MediaPlayerException
    */
   public void setVolume(float volume) throws MediaPlayerException { 
       
      this.volume = volume; 
      if (mp3player != null) { 
         try { 
            mp3player.setVolume(volume); 
         } 
         catch (BasicPlayerException e) { 
            throw new MediaPlayerException("Can't set volume from mp3 file", e); 
         } 
      } 
   } 
   
   /**
    * Get the current volume as float
    * @return The volume
    */
   public float getVolume() { 
      return volume; 
   } 
   
   /**
    * Get the current positon in microseconds
    * @return The position
    */
   public long getPosition() { 
       
      if (MP3.equals(curplayer)) { 
         return mp3player.getPosition() + curLength; 
      } 
      return -1; 
   } 
   
   /**
    * Get the state from the current Player
    * @return The state
    */
   public int getState() { 
      if (MP3.equals(curplayer)) { 
         return mp3player.getState(); 
      } 
      return -1; 
   } 
   
   // play mp3 files
   private void playMp3(File f, long startPosition) throws MediaPlayerException { 
       
      try { 
         curplayer = MP3; 
         setPosition(startPosition); 
         mp3player.setStopped(false); 
         mp3player.play(f, startPosition); 
      } 
      catch (BasicPlayerException e) { 
         throw new MediaPlayerException("Can't play mp3 file", e); 
      } 
   } 
   
   /**
    * Called by the MediaPlayerListener if a song has been finished
    */
   public void songEnded() { 
      songFinished(); 
   } 
}
```

*Mp3Player* (Spielt mp3s ab)


```
package smp.player;

import java.io.File;
import java.util.ArrayList;
import java.util.Map;

import smp.listener.MediaPlayerListener;

import javazoom.jlgui.basicplayer.BasicController;
import javazoom.jlgui.basicplayer.BasicPlayer;
import javazoom.jlgui.basicplayer.BasicPlayerEvent;
import javazoom.jlgui.basicplayer.BasicPlayerException;
import javazoom.jlgui.basicplayer.BasicPlayerListener;

public class Mp3Player implements BasicPlayerListener {

	private BasicPlayer player = null;
	private ArrayList<MediaPlayerListener> listener = null;
	
	private float volume = 0.3F;
	private long curPos = 0;
	private boolean stopped = false;
	private boolean seeking = false;
	
	public Mp3Player() {
		
		listener = new ArrayList<MediaPlayerListener>();
		player = new BasicPlayer();
		player.addBasicPlayerListener(this);
	}
	
	public void addMediaPlayerListener(MediaPlayerListener mpl) {
		listener.add(mpl);
	}
	
	public void removeMediaPlayerListener(MediaPlayerListener mpl) {
		listener.remove(mpl);
	}
	
	public void songFinished() {
		
		for (MediaPlayerListener mpl : listener) {
			mpl.songEnded();
		}
	}
		
	public void play(File f) throws BasicPlayerException {
		play(f, 0);
	}
	
	public void play(File f, long seconds) throws BasicPlayerException {
		
		stop();
		player.open(f);
		player.play();
		setPosition(seconds);
		setCurVolume();
	}
	
	public void stop() throws BasicPlayerException {
		
		if (player != null && player.getStatus() != BasicPlayer.STOPPED) {
			player.stop();
		}
	}
	
	public void setVolume(float volume) throws BasicPlayerException {
		
		this.volume = volume;
		setCurVolume();
	}
	
	public void setPosition(long pos) throws BasicPlayerException{
		
		if (player != null && player.getStatus() != BasicPlayer.STOPPED) {
			seeking = true;
			player.seek(pos);
			seeking = false;
		}
	}
	
	private void setCurVolume() throws BasicPlayerException {
		
		if (player != null && player.getStatus() != BasicPlayer.STOPPED && player.hasGainControl()) {
			player.setGain(volume);
		}
	}

	public float getVolume() {
		return volume;
	}
	
	public long getPosition() {
		return curPos;
	}
	
	public int getState() {
		return player.getStatus();
	}
	
	public void setStopped(boolean stopped) {
		this.stopped = stopped;
	}
	
	public void opened(Object arg0, Map arg1) {
	}

	public void progress(int arg0, long arg1, byte[] arg2, Map arg3) {
		curPos = arg1;
	}

	public void setController(BasicController arg0) {
	}

	public void stateUpdated(BasicPlayerEvent arg0) {
		
		if (player.getStatus() == BasicPlayer.STOPPED && stopped == false && seeking == false) {
			System.out.println("stopped");
			songFinished();
			stopped = true;
		}
		else if (stopped == true && player.getStatus() == BasicPlayer.PLAYING) {
			stopped = false;
		}
	}
}
```

*MediaPlayerException*


```
package smp.exception;

public class MediaPlayerException extends Exception {

	private static final long serialVersionUID = 1L;
	
	public MediaPlayerException() {
		super();
	}

	public MediaPlayerException(String arg0) {
		super(arg0);
	}

	public MediaPlayerException(Throwable arg0) {
		super(arg0);
	}

	public MediaPlayerException(String arg0, Throwable arg1) {
		super(arg0, arg1);
	}
}
```

*MediaPlayerListener*


```
package smp.listener;

public interface MediaPlayerListener {

	public void songEnded();
}
```

Wie gesagt, funktioniert alles soweit (glaub ich). Nur kratzen tuts :x . Würd mich nur freuen, falls das jemand benutzt (und vorallem verbessert  ), dass derjenige hier kurz postet  .


----------



## vdvaart23 (16. Nov 2007)

Hey Hobbit!

Nachdem ich mich schon mit JLayer herumgeärgert habe bin ich hier gelandet.
Ich brauche für ein SW-Projekt genau die selben Funktionalitäten, die du geschildert hast (Pause, Lautstärke).
Wie hast du das gelöst?

Ich hoffe du kannst mir helfen
Lg,
vdvaart23


----------



## The_S (17. Nov 2007)

Äh, ist da oben nicht genug "Beispiel"?


----------



## Timi (28. Mrz 2008)

Ich bastel gerade ein bisschen an deinem Code.
Beim ersten Test laufe ich jedoch schon auf. Wenn ich dem Player eine MP3 Datei gebe bekomme ich:

28.03.2008 10:10:20 javazoom.jlgui.basicplayer.BasicPlayer open
INFO: open(C:\The Way.mp3)
javax.sound.sampled.UnsupportedAudioFileException: could not get audio input stream from input file
	at javax.sound.sampled.AudioSystem.getAudioInputStream(Unknown Source)
	at javazoom.jlgui.basicplayer.BasicPlayer.initAudioInputStream(BasicPlayer.java:330)
	at javazoom.jlgui.basicplayer.BasicPlayer.initAudioInputStream(BasicPlayer.java:266)
	at javazoom.jlgui.basicplayer.BasicPlayer.open(BasicPlayer.java:220)
	at smp.player.Mp3Player.play(Mp3Player.java:54)
	at smp.player.Mp3Player.play(Mp3Player.java:48)
	at Play.main(Play.java:14)

Irgendeinen tipp ob noch eine Lib fehlt? Mir wird in Eclipse nichts mehr angezeigt.


----------



## The_S (28. Mrz 2008)

Evtl. ne Fehlerhafte mp3 Datei? Die Meldung verursacht aufjedenfall der BasicPlayer, weil er mit der mp3 nicht klar kommt.


----------



## Timi (28. Mrz 2008)

Die MP3 Datei wird in WinAMP und Co normal abgespielt.
Ich habe andere auch schon versucht. Klappt nicht.


----------



## The_S (28. Mrz 2008)

Greift evtl. ein anderes Programm auf die Datei zu? Ansonsten wüsste ich da auch nicht weiter, da es wie gesagt wohl eher am BasicPlayer und nicht an mir liegt. Evtl. mal bei javazoom.net anfragen ...


----------



## Timi (28. Mrz 2008)

Nein auch kein anderer Zugriff.

Im Forum von JavaZoom sind einige Postings dieser Art. JavaZoom verweißt nur darauf das die Libs 
- mp3spi1.9.4.jar, 
- jlayer1.0.jar 
- tritonus_share.jar 
im Classpath eingebunden sein müssen.

Ich entwickele in Eclipse. Dazu habe ich mir die Sourcen von "mp3spi" und "jlayer" runtergeladen und direkt im Projekt eingebunden (in src ordner kopiert). Für tritonus habe ich keinen Sourcen gefunden, jedoch eine jar über google und diese eingebunden. Damit sollte das eigentlich erledigt sein oder?


----------



## The_S (28. Mrz 2008)

In den src-Ordner kopiert? Wer macht den so widerliche Sachen? Die JARs werden über den BuildPath eingebunden. Weiter oben habe ich genau aufgelistet welche JARs benötigt werden und wo du die herbekommst, aber für dich nochmal der direkte Download-Link :roll: http://www.javazoom.net/jlgui/sources/basicplayer3.0.zip


----------



## Timi (28. Mrz 2008)

Asche über mein Haupt.

Ich dachte immer es wäre egal ob per LIB eingebunden oder die Sourcen in den Ordner kopiert.

Wieder was gelernt

Danke für die Hilfe


----------



## MiDniGG (28. Mrz 2008)

Stellvertretend für Hobbit (Der A**** hat scho Feierabend...):

Hm. Klappts denn dann jetzt?


----------



## Timi (5. Apr 2008)

Ich habe da noch eine Frage zu dem BasicPlayer, vielleicht weiß hier jemand weiter.

Ich würde gerne neben einer MP3 Datei auch einen MP3-Stream abspielen. Allerdings weiß ich nicht wie ich diesen an den Player übergeben soll?

Jemand dazu eine Idee?


----------



## The_S (10. Apr 2008)

```
public void play(InputStream f, long seconds) throws BasicPlayerException {
      
      stop();
      player.open(f);
      player.play();
      setPosition(seconds);
      setCurVolume();
   }
```

Wenn du das noch in die Mp3Player-Klasse einfügst, solltest du auch Streams abspielen können (ungetestet und schnell aus der API zusammengeklickt).


----------

