Input/Output [Sound]Mp3 datein wiedergeben

DaniSahne96

Mitglied
Ich wollte mir einen eigenen kleinen Musikplayer basteln, da aber Java mp3 nicht unterstützt brauche ich ja ne externe Sound API, jetzt ist die Frage, welche sollte ich nehmen, und könnt ihr mir dazu ein kleines Beispiel zeigen wie ich die mp3 dann wiedergeben kann.
Im mom bin ich bei JLayer von Javazoom angelangt, habe dort in der API(doc) nur die Klasse Player mit Methoden gefunden die alle keine Paramter akzeptieren(mit denen ich angeben kan wo die datei sich befindet)
 

DaniSahne96

Mitglied
//Edit: Mir eben ein Fehler bewusst geworden: Ich brauche nicht unbedingt eine Methode die Paramter akzeptiert, wies geht weis ich aber trotzdem nich
 
S

Spacerat

Gast
Bin mir fast sicher, du meinst diese hier.
Das ist der einzige MP3-Layer für Java den ich kenne, der es so macht, wie es die Standard-JVM vorsieht, er nutzt das Java Sound API ("javax.sound.sampled"). Dort findest du die Klasse AudioSystem, mit welcher du diese Dateien nun laden und abspielen kannst. Applet.newAudioClip() funktioniert zwar nun auch, aber solch' "lazy things" empfehle ich nicht.
 

Cola_Colin

Top Contributor
Ich hab mich gerade auch mit genau der API beschäftigt, der einfachste Weg ist die jlGui - BasicPlayer - JavaSound API
zu verwenden. Mit den Libs kann man sich dann zum Beispiel sowas bauen:

Java:
public class OneTimePlayer extends BasicPlayer{
	public static void main(String[] args) throws FileNotFoundException, JavaLayerException, BasicPlayerException, MalformedURLException {
		File f = new File("pfad zur mp3");

		final OneTimePlayer player = new OneTimePlayer();
		player.init(f);
		player.play();
		player.setGain(0.2);
		player.seekMs(30000);
	}

	private Map<String, Object> audioInfo = null;
	
	public void init(File f) throws BasicPlayerException {
		addBasicPlayerListener(new PlayerListenerAdapter() {
			@SuppressWarnings({ "rawtypes", "unchecked" })
			@Override
			public void opened(Object arg0, Map arg1) {
				audioInfo = arg1;
			}
		});
		open(f);
	}
	
	public void seekMs(long ms) throws BasicPlayerException {
		long lengthMs = getDurationMs();
		double rate = Math.max(0, Math.min((double)ms / lengthMs, 1));
		
        long skipBytes = (long) Math.round(((Integer) audioInfo.get("audio.length.bytes")).intValue() * rate);
        seek(skipBytes);
	}
	
	public long getDurationMs() {
		return ((Long)audioInfo.get("duration")) / 1000;
	}
}

EDIT:
Noch eine ganz wichtige Klasse vergessen:

Java:
public class PlayerListenerAdapter implements BasicPlayerListener {

	@Override
	public void opened(Object arg0, @SuppressWarnings("rawtypes") Map arg1) {

	}

	@Override
	public void progress(int arg0, long arg1, byte[] arg2, @SuppressWarnings("rawtypes") Map arg3) {

	}

	@Override
	public void setController(BasicController arg0) {

	}

	@Override
	public void stateUpdated(BasicPlayerEvent arg0) {

	}
}
 
Zuletzt bearbeitet:

DaniSahne96

Mitglied
So nach etlichen Stunden vorm Laptop bin ich nun auf diesen Code gestoßen: Java Reference Guide | JLayer | InformIT, allerdings beinhaltet der Code viele "Extras" die zwar sinnvoll sind, aber fürs grundlegende Verständniss erstmal stören, also hab ich den Code auf diese 3 Zeilen in der main() reduziert:
Java:
InputStream is = new FileInputStream("C:/Users/Dani/Desktop/Whistle.mp3");
		
Player player = new Player(is);
player.play();

denke mal das ist selbsterklärend, erstaunlich das es für so etwas Grundlegendes kein gscheites Tutorial gibt(oder ich keins gefunden hab) welches einfach nur das ganz simple wiedergeben einer mp3 beschreibt, alles was ich gefunden hab war irgendein ellenlanger code der die oben genannten 3 Zeilen auf möglichst kompliziertem weg versteckt.Naja jetzt weis ich ja wies geht, und ich hoffe mal alle anderen verzweifelten können hiermit auch was anfangen

Mfg Dani
 
S

Spacerat

Gast
Klar können die was damit anfangen, wenn du noch auf "erledigt" klickst finden sie es obendrein auch einfacher.

Das Problem mit dem Laden und Abspielen von Sound-Dateien in diversen Formaten liegt ganz einfach an der "bestussten" Handhabung der Standard-Sound-API. Deswegen verwendet sie wohl auch kaum einer und statt dessen nur diesen Player des JLayers, welcher aber afaik Sounds nur als Clip wiedergeben kann, was wiederum bedeutet, dass man erneut wieder ganz andere APIs braucht, um verschiedene Dateien evtl. zu mischen.
Wie also ist die Sound-API aufgebaut?
Zunächst gibt es da mal das sog. Sound-SPI. SPI steht dabei für Service-Provider-Interface, welches im allgemeinen zum Einbinden beliebiger Dienste usw. vor allem aber zum Einbinden von Dateitypen in Java verwendet werden kann. So wird es auch z.B. von JLayer dazu verwendet, MP3 Dateien in Java verfügbar zu machen, der Player ist sozusagen nur ein Addon zum einfachen Abspielen von Sounds.
Als nächstes hat man eine ganze Galaxie an verschachtelten Interfaces, also Line, DataLine, SourceDataLine, TargetDataLine, Mixer und Clip und innerhalb dieser widerum jeweils ein weiteres namens Info. Glücklicherweise muss man von diesen Interfaces nur sehr selten selbst eines implementieren, aber es ist für die Verwendung des APIs essentiell zu wissen, das es sie gibt.
Dann kommen noch diverse Controls und Controlsets, für Lautstärke, Balance, Muting und Zeugs hinzu. Diese kann man sich von der jeweils geladenen Datei, welche nun mindestens als Line vorliegt, besorgen, um ihre Abspiellautstärke oder was auch immer zu beeinflussen.
Das mehr oder weniger wichtigste kommt nun zum Schluss, die Klassen AudioInputStream und AudioSystem. Mit denen lassen sich alle Sounddateien, für die ein SPI-Provider im Classpath gefunden wurde, laden und abspielen, das Ganze sieht in der Realität etwa so aus:
Java:
public class PlaySound
{
  private static void playSampleFile(String name, float pan, float gain)
  throws Exception
  {
    //AudioInputStream öffnen
    AudioInputStream ais = AudioSystem.getAudioInputStream(
      new File(name)
    );
    AudioFormat format = ais.getFormat();
    //ALAW/ULAW samples in PCM konvertieren
    if ((format.getEncoding() == AudioFormat.Encoding.ULAW) ||
        (format.getEncoding() == AudioFormat.Encoding.ALAW))
    {
      AudioFormat tmp = new AudioFormat(
        AudioFormat.Encoding.PCM_SIGNED,
        format.getSampleRate(),
        format.getSampleSizeInBits() * 2,
        format.getChannels(),
        format.getFrameSize() * 2,
        format.getFrameRate(),
        true
      );
      ais = AudioSystem.getAudioInputStream(tmp, ais);
      format = tmp;
    }
    //Clip erzeugen und öffnen
    DataLine.Info info = new DataLine.Info(
      Clip.class,
      format,
      ((int) ais.getFrameLength() * format.getFrameSize())
    );
    Clip clip = (Clip)AudioSystem.getLine(info); 
    clip.open(ais);
    //PAN einstellen
    FloatControl panControl = (FloatControl)clip.getControl(
      FloatControl.Type.PAN
    );
    panControl.setValue(pan);
    //MASTER_GAIN einstellen
    FloatControl gainControl = (FloatControl)clip.getControl(
      FloatControl.Type.MASTER_GAIN
    );
    gainControl.setValue(gain);
    //Clip abspielen
    clip.start(); 
    while (true) {
      try {
        Thread.sleep(100);
      } catch (Exception e) {
        //nothing
      }
      if (!clip.isRunning()) {
        break;
      }
    }
    clip.stop();
    clip.close();
  }

  public static void main(String[] args)
  {
    try {
      playSampleFile(
        args[0],
        Float.parseFloat(args[1]),
        Float.parseFloat(args[2])
      );
    } catch (Exception e) {
      e.printStackTrace();
      System.exit(1);
    }
    System.exit(0);
  }
}
Den Code kannst du jetzt ausprobieren, damit rum experimentieren, ausdrucken und/oder auswendig lernen, ganz wie du willst ('ne gute Idee, wäre es, wenn du mal bei dessen Quelle nach einem herunterladbaren Javabuch inkl. Beispiele ausschau hälst.). Kommt drauf an, wie weit du dich in Sachen Sound auf andere APIs verlassen willst oder wie weit du dich selber damit auskennen möchtest. Denn sind wir mal ehrlich, einfaches Handling sieht anders aus aber dass ist das Standard-Sound-API von Java und einfacher wird's damit leider nicht. Für "einfacher" lassen sich sogar noch andere Attribute einsetzen, z.B. komfortabel.
 
F

FMODEx

Gast
Man könnte auch noch die sehr populäre Lib FMOD bzw FMODEx nutzen. Beide wurde bereits mit JNI-Libs für Java verfügbar gemacht. Warum also das Rad neu erfinden ?
 
S

Spacerat

Gast
Ach, und damit kann Java, wenn man die DLL in den Systemsuchpfad legt, MP3 und alles per AudioSystem laden? Das probier' ich mal aus. Wenn's nicht klappt...

...es klappt also nicht, demnach benötigt auch diese Lösung ein weiteres API und damit wurde auch damit das Rad erneut neu erfunden. Also... wie soll das gehen?
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
M TicTacToe Sound nach jedem Zug Allgemeine Java-Themen 21
ms_cikar JavaOSC (Open Sound Control) Allgemeine Java-Themen 1
J Java Sound Api Sound input und Output auswählen Allgemeine Java-Themen 4
J Sound mit Clip in Linux abspielen Allgemeine Java-Themen 3
J Sound mit Hall und Equalizer abspielen lassen Allgemeine Java-Themen 6
K Sound-Visualisierung in Java Allgemeine Java-Themen 0
Tacofan Sound abspielen Allgemeine Java-Themen 1
Tacofan Sound beim öffnen der GUI Allgemeine Java-Themen 8
javampir Seltsame Lücken beim Abspielen von Sound Allgemeine Java-Themen 2
D Library/Framework zum Umwandeln von Sound in Notenbilder Allgemeine Java-Themen 1
V Input/Output Sound Dateien aus Jar laden Allgemeine Java-Themen 18
S Java sound pitch modulation Allgemeine Java-Themen 2
B Java Sound Memory Overload Allgemeine Java-Themen 0
B Javax.Sound Problem (setMessage-Methode) Allgemeine Java-Themen 2
I Sound abspielen aus einem Sample-Array Allgemeine Java-Themen 2
I javax.sound.sampled.* - Hilfe zu den Controls Allgemeine Java-Themen 8
G Threads Klasse Sound und Threads bleiben hängen Allgemeine Java-Themen 4
B AudioInputStream, bzw. Sound bearbeiten / splitten Allgemeine Java-Themen 2
Apo Java Sound Mark/Reset Exception Allgemeine Java-Themen 14
Developer_X Java Sound Lautstärke Allgemeine Java-Themen 10
A sound Allgemeine Java-Themen 4
R Sound unter Java Allgemeine Java-Themen 12
grudge Problem mit Sound Allgemeine Java-Themen 2
I Java und Sound Allgemeine Java-Themen 5
P Sound Buffer prüfen Allgemeine Java-Themen 12
C Sound stoppt Rest & Lautstärke-Problem Allgemeine Java-Themen 4
M Sound in datei abspeichern Allgemeine Java-Themen 3
T Java Sound Engine: Was liegt drunter? Allgemeine Java-Themen 7
E Nach Packen in Jar ist Sound nur noch abgehackt zu hören Allgemeine Java-Themen 2
oliver1974 Java Sound und gleichzeitger Zugriff auf Soundkarte Allgemeine Java-Themen 3
S sampled sound mixen Allgemeine Java-Themen 15
T Sound in JFrame: Ich krichs nich hin =( Allgemeine Java-Themen 7
S Kein Sound in Java Applets unter Win 9x Allgemeine Java-Themen 4
P kein sound bei freenet spielen Allgemeine Java-Themen 2
H Java Sound Allgemeine Java-Themen 2
M Sound anhand von gegebener Frequenz abspielen Allgemeine Java-Themen 2
D Sound ruckelt. Allgemeine Java-Themen 9
M Sound abspielen ohne Sounddatei Allgemeine Java-Themen 5
H Sound wiedergabe und Threads Allgemeine Java-Themen 3
bernd Sound abspielen? Allgemeine Java-Themen 6
K Sound abspielen in Java 1.5 Allgemeine Java-Themen 6
G Mit Klassenlader Sound Ressourcen laden Allgemeine Java-Themen 10
C Sound: Keine Line gefunden. Zu großer internal buffer? Allgemeine Java-Themen 3
P javax.sound: clip.stop(); Allgemeine Java-Themen 4
L Java Sound Allgemeine Java-Themen 2
D Wiedergabe von .wav-Dateien(Sound)? Allgemeine Java-Themen 2
L Datein einlesen. Allgemeine Java-Themen 5
D Jar Datein öffnen Allgemeine Java-Themen 9
A Input/Output VBS-Datein mit Java Ausführen Allgemeine Java-Themen 2
H FTP Datein down- und uploaden Allgemeine Java-Themen 1
MineJoke "Config" Datein wir bei neustart des Programms neu erstellt? Allgemeine Java-Themen 0
J Java Dateidownload klappt bei einigen Datein nicht Allgemeine Java-Themen 7
T Nach Java Update: Jar Datein öffnen sich nicht mehr mit doppelklick Allgemeine Java-Themen 3
T Hash von *.class-Datein überprüfen Allgemeine Java-Themen 1
P .Jar Datein Windows Konsole zugewiesen Allgemeine Java-Themen 3
M GWT Datein Speichern Allgemeine Java-Themen 2
S Probleme beim Start von jar Datein Allgemeine Java-Themen 15
0 Datein aus laufender Jar lesen und bearbeiten Allgemeine Java-Themen 10
J Datein speichern Allgemeine Java-Themen 2
ARadauer Schon mal jemand für Ungarn CSV Datein geschreiben? Allgemeine Java-Themen 2
N Datein in Papierkorb verschieben Allgemeine Java-Themen 2
M UTF-8 Datein einlesen, Zeichenproblem Allgemeine Java-Themen 9
X Warum kann ich keine ZIP Datein mit renameto() in was anderes benennen? Allgemeine Java-Themen 13
ARadauer Word Datein bearbeiten Allgemeine Java-Themen 3
X Wie verdammt große Datein öffnen? Allgemeine Java-Themen 2
M Nach export in jar datei werden Datein nicht eingelesen Allgemeine Java-Themen 7
D Verschiedene Datein aus einer Zip Datei ins Programm laden Allgemeine Java-Themen 4
B sorteiren von Datein nach Zeitstempel in einem Vector Allgemeine Java-Themen 5
ARadauer PDF Datein verbinden Allgemeine Java-Themen 3
V JFilechooser, mehrere Datein selektieren und Reihenfolge? Allgemeine Java-Themen 2
H Arbeitsverzeichnis für Datein wechseln Allgemeine Java-Themen 7
H gezippte Datein öffnen Allgemeine Java-Themen 7
C Temporäre Datein anlegen Allgemeine Java-Themen 2
U ZIPPEN von Datein, Ordnern und Unterordnern Allgemeine Java-Themen 7
H html datein einfügen Allgemeine Java-Themen 7
I Fehler beim Schreiben von Datein Allgemeine Java-Themen 3
M Cache & Datein kopieren Allgemeine Java-Themen 3
M Datein einlesen und in feste Größe aufsplitten Allgemeine Java-Themen 2
G class datein verschlüsseln Allgemeine Java-Themen 3
N Input/Output Website Text auslesen und bestimmte Zeilen wiedergeben Allgemeine Java-Themen 4
I Vector mit Objekten sortieren,Videos mit JMF wiedergeben Allgemeine Java-Themen 6
N Mehrere Audioclips gleichzeitig wiedergeben Allgemeine Java-Themen 9

Ähnliche Java Themen

Neue Themen


Oben