kleine mp3 Lib

Status
Nicht offen für weitere Antworten.

The_S

Top Contributor
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

Bekanntes Mitglied
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

Top Contributor
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

Top Contributor
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

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

The_S

Top Contributor
Jockel hat gesagt.:
Hm, zu FMOD gibt es ein paar Java-Bindings, vielleicht solltest du mal da einen Blick drauf werfen.

Was ist FMOD :oops: ?

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

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 :D . 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)

Code:
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)

Code:
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

Code:
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

Code:
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 :D ), dass derjenige hier kurz postet :) .
 

vdvaart23

Mitglied
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
 
T

Timi

Gast
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

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

Timi

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

The_S

Top Contributor
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 ...
 
T

Timi

Gast
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?
 
T

Timi

Gast
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
 
M

MiDniGG

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

Hm. Klappts denn dann jetzt? :)
 
T

Timi

Gast
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

Top Contributor
Code:
   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).
 
Status
Nicht offen für weitere Antworten.
Ähnliche Java Themen
  Titel Forum Antworten Datum
N kleine Kommazahlen erscheinen plötzlich Allgemeine Java-Themen 19
T Kniffel: kleine Straße Allgemeine Java-Themen 6
I GUI für kleine Pop-Ups unter Windows Allgemeine Java-Themen 1
S Wie kann ich eine kleine Stelle in meinem Code mit multiplen Threads abarbeiten..? Allgemeine Java-Themen 20
Soloeco Kleine Optimierungsfrage Allgemeine Java-Themen 6
RalleYTN Classpath Nur ne kleine Frage zur MANIFEST.MF Allgemeine Java-Themen 4
vandread Kleine Generics Aufgabe aus einer Prüfung... wie ist das gemeint? Allgemeine Java-Themen 6
Y Kleine Frage zu String.split Allgemeine Java-Themen 3
W Kleine Frage zu Null-Pinter-Exception Allgemeine Java-Themen 21
D Kleine Frage zum öffnen eines Fensters Allgemeine Java-Themen 10
A Drucken auf kleine Formate Allgemeine Java-Themen 2
O kleine Fragen eines Anfängers Allgemeine Java-Themen 2
musiKk Best Practice für kleine Variationen in gegebenen Modellklassen Allgemeine Java-Themen 11
nrg Kleine Hilfe mit RegEx Allgemeine Java-Themen 2
L Kleine Rekursion Allgemeine Java-Themen 12
B Kleine Frage zu Modellierung (Videothek) Allgemeine Java-Themen 2
J Eine kleine Aufnahme mit Java Allgemeine Java-Themen 3
J Kleine Hilfe zum Framework Click Allgemeine Java-Themen 2
Lulumann6 kleine frage zu KeyEvents Allgemeine Java-Themen 10
G Kleine Frage zu Vectoren Allgemeine Java-Themen 2
D kleine SQL-Hilfe benötigt: not a single-group group function Allgemeine Java-Themen 4
T Designfrage: Viele, kleine Objekte Allgemeine Java-Themen 13
M Schnell kleine Hilfe gesucht! Allgemeine Java-Themen 3
K Mit Java kleine Freeware Programme erstellen. Geht das? Allgemeine Java-Themen 16
L kleine frage zum rechner Allgemeine Java-Themen 7
V kleine Threadfrage Allgemeine Java-Themen 10
T Kleine Verständnisfrage zu Stringbuffer Allgemeine Java-Themen 2
K Kleine Exception Frage ! Allgemeine Java-Themen 3
B Wie heißt dieser kleine Typ links oben? Also dieses JavaVieh Allgemeine Java-Themen 5

Ähnliche Java Themen

Neue Themen


Oben