# *.mp3 in Applets nutzen



## Dirt Devil (4. Apr 2007)

Hallo liebe Leute!

Ich möchte gerne einige mp3 Audio Dateien in meinem Applet nutzen, da das wav Format zu groß fürs Internet ist. Allerdings weiss ich nicht, wie ich dies anstellen kann.

Ich bin bei meinen Recherchen auf "JLayer" gestoßen. Doch ich weiss nicht, wie ichs einbinden kann, ohne das der Client beim Ausführen des Applets über einen Browser großartige Voreinstellungen durchführen muss. Über eine Schritt-für-Schritt Anleitung wäre ich, wie wahrscheinlich viele andere Java Anfänger auch, äußerst dankbar.

Zusätzlich würde ich es auch noch genial finden, wenn ihr mir einige Zusatzfunktionen des JLayers wie beispielsweise Lautstärke ändern schildern könntet.

Danke im Vorraus,
Dirt Devil


----------



## JPKI (4. Apr 2007)

Java Media Framework mit mp3-PlugIn. Schau mal auf http://java.sun.com.
Edit: Auf der angegebenen Webseite kann man sich (für Windows) eine EXE-Datei herunterladen. Das ist das Hauptpacket von JMF. Ebenfalls kann man sich dort das mp3-PlugIn herunterladen. Dieses einfach in das Verzeichnis *lib\ext* im JRE Hauptordner kopieren und in der DOS-Konsole den Befehl *java com.sun.media.codec.audio.mp3.JavaDecoder* ausführen und feddich is. Wie man JMF benutzt, kannst du prima auf angegebener Seite nachlesen.


----------



## Dirt Devil (4. Apr 2007)

Und wie siehts da mit dem Clienten aus? Kann der nur mit der JRE das Applet dann starten?
Falls nein, gibts eventuell noch eine weitere Möglichkeit? Könnte ich dann vielleicht die benötigten Libs nicht zum Projekt auf meinen Webspace laden? Aber wie rufe ich die dann auf?

Die paar Fragen noch   
Danke,
Dirt Devil


----------



## JPKI (4. Apr 2007)

Dirt Devil hat gesagt.:
			
		

> Kann der nur mit der JRE das Applet dann starten?


Man kann *alle Applets nur mit der JRE* starten...
Aber ich glaube ich weiss was du willst: Ja, dann müsste jeder JMF mit mp3-PlugIn installieren.
Klar, das wär sch**sse... Leider kenne ich mich mit JLayer nicht aus, sonst könnte ich dir auch dafür Tipps geben.


----------



## Dirt Devil (4. Apr 2007)

Vielleicht findet jemand anders noch einen weiteren Weg...
Trotzdem Danke  :toll:


----------



## The_S (5. Apr 2007)

JMF kannst du als Lib beilegen, die JRE wird immer beim Client benötigt. Wenn du aber das JMF beilegst, dann nur ohne mp3 Unterstützung.

Als alternative kannst du das BasicPlayer API von www.javazoom.net verwenden. Damit lassen sich sehr einfach mp3 Dateien abspielen. Aus eigener Erfahrung krazt die Wiedergabe aber teilweise.

Generell gesagt ist die mp3 Unterstützung von Java, ohne großen Aufwand zu betreiben, eher mager.


----------



## Dirt Devil (5. Apr 2007)

Danke für dieses Alternative!

Kann man den BasicPlayer auch als Lib beilegen? So etwas hab ich noch nicht gemacht. Kannst du mir kurz Anweisungen geben, wie ich die Libs dem Projekt hinzufüge und welchen import Befehl ich dafür nutzen muss?
Und schafft es der BasicPlayer auch die Lautstärke zu ändern?  :### 

Danke,
Dirt Devil


----------



## The_S (5. Apr 2007)

Der BasicPlayer schafft bezüglich mp3s alles, was das JMF auch schafft. Um deinem Projekt eine Lib zuzuweisen, musst du diese lediglich in den Classpath mit aufnehmen. Anschließend können die Klassen und packages wie gewohnt importiert werden.


----------



## Dirt Devil (5. Apr 2007)

Aber dann müsste ja jeder Nutzer meines kleinen Spielchens  zuerst JLayer runterladen und den classpath Befehl ausführen....das wär schon kompliziert, da gibts bestimmt noch einen anderen Weg...
Könnte man den classpath Befehl nicht beim Starten des Programms ausführen???
Eventuell müsste man nach Nutzen des Programms diesen wieder löschen, da nach öfteren Nutzen das System mit classpath vollgestopft ist  :bae: 

Vielleicht geht das ja so irgendwie....


----------



## The_S (5. Apr 2007)

Äh ... hä? Du hast da grundsätzlich was falsch verstanden. Externe Libs werden der eigentlichen Applikation beigelegt oder in diese integriert. Deine Applikation packst du dann in ein Jar-File. Diesem Jar-File gibst du ein Manifest mit, in dem du dann den Class-Path für dein Programm festlegen kannst und somit auf die externe Lib verweist.

Näheres zum Classpath und Jars findest du in den FAQ!


----------



## Wildcard (5. Apr 2007)

Du kannst im html mehrere JAR Archive angeben. Die bilden dann den Classpath


----------



## Dirt Devil (5. Apr 2007)

Das geht? Na supi! Danke!

Wie soll dann der import Befehl aussehen? Ist das dann ein Spezial-Befehl oder sieht der auch ganz normal wie immer aus?


----------



## The_S (5. Apr 2007)

ganz normal wie immer natürlich.


----------



## Dirt Devil (5. Apr 2007)

Supi, dann gleich mal ausprobieren! Danke  :toll: 

Jetzt kommen wir zum Player selbst:
Das BasicPlayer API hab ich bei javazoom nicht gefunden (vielleich bin ich auch einfach nur zu blöd dazu)
oder meinst du einfach die javazoom.jl.player.player.class ?
Und wie kann ich ihn dann nutzen. Wärt ihr so freundlich und könntet mir einen kurzen Überblick über die Methoden geben (wie binde ich audio files ein, wie starte/stoppe ich sie, wie regel ich die Lautstärke - das wären meine Kernpunkte)

Das wäres es dann aber auch.

Großes Lob und Dankeschön,
Dirt Devil


Edit: ein einfacher Link zu einer verständlichen Erklärung würde reichen. Oder einfach nur ne kleine Tabelle, z.B.:
audioclip clip = new audioclip(src) - audioclip erstellen
clip.play() - audioclip abspielen
usw.

Ist das mit der Lautstärkeregelung bei JLayer gleich mit der normalen sound.class (also mit FloatControl.Type.MASTER_GAIN)

Und schafft es JLayer auch verschiedene Clips parallell abzuspielen???


----------



## The_S (5. Apr 2007)

Ich meinte nicht JLayer, der ist veraltet. Ich meinte schon die BasicPlayer API. Warhscheinlich hast du sie nur übersehen ...

http://www.javazoom.net/jlgui/api.html

Hier findest du auch gleich eine Dokumentation um dir einen Überblick zu verschaffen, wie das Ganze funktioniert


----------



## Dirt Devil (5. Apr 2007)

Der Basicplayer scheint auch noch ne Menge mehr zu können als JLayer, sogar die Lautstärke-Regelung scheint keine Problem mehr zu sein  :wink:
Ich werds später mal ausprobieren, mir brummt grad der Schädel

Großes Dankeschön vorab,
Dirt Devil


----------



## Dirt Devil (18. Apr 2007)

So, ich bin ein kleines Stück weiter gekommen, allerdings sind eine ganze Menge Probleme dazugekommen...
Ich bin schon mal so weit, dass das BasicPlayer-Paket und auch alle benötigten Unterklassen angenommen werden (es werden keine "ClassNotFound" Exceptions geworfen).
So nun zu den Problemen, aber erst mal der Minimal-Quelltext:

```
import javazoom.jlgui.basicplayer.*;
import java.awt.*;
import javax.swing.*;
import java.applet.*;
import java.io.*;

public class mp extends Applet
{
    String meldung = "alles bestens!";

    public mp()
    {
    }
    
    public void init()
    {
        BasicPlayer player = new BasicPlayer();
        BasicController control = (BasicController) player;
        try
        {
            control.open(new File("abc.mp3"));
            control.play();
        }
        catch (Exception e)
        {
            meldung = "Exception geworfen!";
        }
    }
    
    public void paint(Graphics g)
    {
        g.drawString(meldung,20,20);
    }
}
```

Probleme:
- Der Player funktioniert im Appletviewer weder mit mp3 noch mit wave (hängt sich beim Laden auf)
- Der Player funktioniert zwar wunderbar mit wave, aber mp3 wird nicht angenommen (es wird irgendeine Exception geworfen - hier funktioniert auch der Appletviewer)


Text, der im Terminal Window ausgegeben wird:
für wave:

```
18.04.2007 22:25:06 javazoom.jlgui.basicplayer.BasicPlayer open
INFO: open(abc.wav)
18.04.2007 22:25:06 javazoom.jlgui.basicplayer.BasicPlayer createLine
INFO: Create Line
18.04.2007 22:25:06 javazoom.jlgui.basicplayer.BasicPlayer createLine
INFO: Create Line : Source format : PCM_SIGNED 44100.0 Hz, 16 bit, stereo, 4 bytes/frame, little-endian
18.04.2007 22:25:06 javazoom.jlgui.basicplayer.BasicPlayer createLine
INFO: Create Line : Target format: PCM_SIGNED 44100.0 Hz, 16 bit, stereo, 4 bytes/frame, little-endian
18.04.2007 22:25:06 javazoom.jlgui.basicplayer.BasicPlayer createLine
INFO: Line : com.sun.media.sound.DirectAudioDevice$DirectSDL@e14d81
18.04.2007 22:25:06 javazoom.jlgui.basicplayer.BasicPlayer startPlayback
INFO: startPlayback called
18.04.2007 22:25:06 javazoom.jlgui.basicplayer.BasicPlayer initLine
INFO: initLine()
18.04.2007 22:25:06 javazoom.jlgui.basicplayer.BasicPlayer openLine
INFO: Open Line : BufferSize=88200
18.04.2007 22:25:06 javazoom.jlgui.basicplayer.BasicPlayer openLine
INFO: Master Gain Control : [-80.0,6.0206] 0.625
18.04.2007 22:25:06 javazoom.jlgui.basicplayer.BasicPlayer openLine
INFO: Pan Control : [-1.0,1.0] 0.0078125
18.04.2007 22:25:06 javazoom.jlgui.basicplayer.BasicPlayer startPlayback
INFO: Creating new thread
18.04.2007 22:25:06 javazoom.jlgui.basicplayer.BasicPlayer run
INFO: Thread Running
18.04.2007 22:25:06 javazoom.jlgui.basicplayer.BasicPlayer closeStream
INFO: Stream closed
18.04.2007 22:25:06 javazoom.jlgui.basicplayer.BasicPlayer run
INFO: Thread completed
```

für mp3:

```
18.04.2007 22:26:30 javazoom.jlgui.basicplayer.BasicPlayer open
INFO: open(abc.mp3)
```

Im Projektordner befinden sich folgende Dateien und Ordner:
- javazoom
- org
- abc.mp3
- mp.class
- mp.ctxt
- mp.java

Es scheint also irdendwie an der Datei zu liegen....
Und beim Appletviewer hab ich nicht einmal einen Ansatz zur Lösung...

Ich würde mich über jegliche Hilfe freuen, da ich hier langsam am Verzweifeln bin...

Danke,
Dirt Devil


----------



## The_S (18. Apr 2007)

Verwende doch einfach mal die Forensuche. Mit dem Schlagwort "BasicPlayer" kommst du gerade mal auf ne handvoll Beiträge. Unter anderem auf diesen

http://www.java-forum.org/de/viewtopic.php?t=36827&highlight=basicplayer


----------



## Dirt Devil (19. Apr 2007)

Ich habs mit deinem Player ausprobiert...allerdings bleibt dasselbe Problem...
Ich hab den Quelltext etwas geändert:

MediaPlayer

```
import java.io.*; 
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; 

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;
   
   private File f;
    
   /** 
    * Construct a new MediaPlayer 
    */ 
   public MediaPlayer() { 
        
      listener = new ArrayList<MediaPlayerListener>(); 
      mp3player = new Mp3Player(); 
      mp3player.addMediaPlayerListener(this);
      f = new File("test.mp3");
   } 
    
   /** 
    * 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() 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(); 
   } 
}
```

Er wirft eine MediaPlayerException.


```
19.04.2007 23:50:07 javazoom.jlgui.basicplayer.BasicPlayer open
INFO: open(test.mp3)
MediaPlayerException: Can't play mp3 file
	at MediaPlayer.playMp3(MediaPlayer.java:206)
	at MediaPlayer.play(MediaPlayer.java:89)
	at MediaPlayer.play(MediaPlayer.java:74)
Caused by: javazoom.jlgui.basicplayer.BasicPlayerException: javax.sound.sampled.UnsupportedAudioFileException: could not get audio input stream from input file
	at javazoom.jlgui.basicplayer.BasicPlayer.initAudioInputStream(Unknown Source)
	at javazoom.jlgui.basicplayer.BasicPlayer.open(Unknown Source)
	at Mp3Player.play(Mp3Player.java:53)
	at MediaPlayer.playMp3(MediaPlayer.java:203)
	at MediaPlayer.play(MediaPlayer.java:89)
	at MediaPlayer.play(MediaPlayer.java:74)
	at __SHELL11.run(__SHELL11.java:8)
	at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
	at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
	at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
	at java.lang.reflect.Method.invoke(Method.java:597)
	at bluej.runtime.ExecServer$3.run(ExecServer.java:855)
Caused by: javax.sound.sampled.UnsupportedAudioFileException: could not get audio input stream from input file
	at javax.sound.sampled.AudioSystem.getAudioInputStream(AudioSystem.java:1170)
	at javazoom.jlgui.basicplayer.BasicPlayer.initAudioInputStream(Unknown Source)
	... 12 more
```

Anscheinend scheint etwas mit der Datei nicht zu stimmen....aber ich habs mit vielen verschiedenen probiert und bin zu keinem besseren Ergebnis gekommen.

Manno...langsam bin ichs Leid

Bitte helft mir!!!
Dirt Devil


----------



## The_S (20. Apr 2007)

Sicher, dass alles richtig eingebunden ist? Die BasicPlayer API benötigt zusätzlich noch die common-logging jar, die jl1.0.jar, die mp3spi.jar und die tritonus-share.jar. Ansonsten Class-Path richtig gesetzt?


----------



## Dirt Devil (20. Apr 2007)

Für deinen Quelltext benötige ich jedoch ein smp package und ich weiss nicht, woher es stammt oder was das ist oder wie ich das einbinden kann. Ich nutze BlueJ (bluej.org) und hab externe Klassen noch nie zusätzlich in ein Projekt eingebunden.

BlueJ löscht alle "package" Kommandos im Quelltext, da er angeblich die Dateien nicht finden kann. package ist ja sowas änliches wie import. Wie krieg ich jetzt dieses package da rein...

Tut mir Leid, aber ich habe echt keine Ahnung was ich machen soll... Ich scheine grundlegende Probleme in dieser Art des Einbindens zu haben... Benötige eine grundlegende Erläuterung...
Wäre schön wenn du mir erlären könntest wohin ich was packen muss, dann weiss ich, wie ichs später machen muss und brauch nicht mehr zu fragen ^^.
Dirt Devil


----------



## The_S (20. Apr 2007)

package definiert den späteren import. So könnte man es sagen. BlueJ ist der größte mist. Wenn du eine einfache IDE möchtest, verwende JCreator. Ansonsten Eclipse oder Netbeans. Aber blos kein BlueJ.

Du kannst einfach die Forensuche benutzen oder Google oder in deinem anfängerbuch nachlesen. Wie man jars einbindet und was imports und packages sind, findest du überall, da grundlegend!


----------



## Guest (23. Apr 2007)

Ich bins nochmal,
auch trotz neuer Erkenntnisse bin ich kein Stück weiter gekommen....

Gibts es irgendwelche Bedingungen für die mp3 Dateien (etwa kein IDE-Tag oder bestimmte Bitrate oder ähnliches)? Wenn ja könnte es daran liegen...

ogg wäre auch eine Alternative (aber wie?).

Kannst du mir nicht bitte bitte bitte dein Projekt per E-Mail schicken. Dann kann ich deine richtige Version studieren und meinen Fehler suchen und ihn inklusive Lösung hier posten. Leichter fällt mir dies noch, wenn du alles in den deafult-Classpath packst (also Projektordner). Von Classpath hab ich nämlich nicht viel Ahnung, da ich nur direkt über die BlueJ-IDE kompiliere (danke hier nochmal an meinen Lehrer -.-). Ich glaube nämlich, dass da irgendetwas mit meinen directories nicht stimmt.

Vielleicht kannst du ja eine kleine mp3-Datei mitliefern, die bei dir uneingeschränkt funktioniert, um auszuschließen, dass alle meine mp3-Dateien nicht kompatibel sind  :bae: .
Pack alles in ein Archiv, der als Projektordner gelten wird (ich nehme so gut wie alle gängigen Formate an).

A propos: CLASSPATH hab ich nicht gesetzt. Ich hab alles Libs einfach in den Projektordner kopiert. Der default-Classpath greift da ja.
Sorry mit BlueJ, aber unsere Schule möchte unbedingt an dieser IDE festhalten. Ich lade mir morgen mal den Borland JBuilder.
Ja, ich finde BlueJ auch total bescheuret.

Sorry, wenn ich dich nerve (Ich glaube, dass du langsam genug von diesem Problem hast)...aber ich möchte gerne komprimierte Musik für die Web-Anwendung nutzen, komprimiert ist dafür doch zu groß...

E-Mail bekommst du per PN.

Danke,
Dirt Devil


----------



## The_S (24. Apr 2007)

Ogg funktioniert mit dem BasicPlayer genauso. Musste nur ne zusätzliche lib mit reinpacken. Wenn du ein komplettes Projekt für die Struktur möchtest, dann schau dir jlgui von javazoom an. Das ist ein Projekt auf Basis des BasicPlayers

http://www.javazoom.net/jlgui/sources.html

inkl. libs, inkl source, inkl mp3 und ogg support. Have Fun!


----------

