Du verwendest einen veralteten Browser. Es ist möglich, dass diese oder andere Websites nicht korrekt angezeigt werden. Du solltest ein Upgrade durchführen oder ein alternativer Browser verwenden.
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)
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.
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) {
}
}
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
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:
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.
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 ?
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?