Frage von yeretor, 84

JavaFX MP3 abspielen?

Hallo.

Ich möchte ein Projektexternes .mp3 file irgendwo auf der Festplatte ablspielen. Hab schon zimlich viel gegoogled, es kommt aber nichts brauchbares.

Danke im vorraus für jede Antwort.

Hilfreichste Antwort - ausgezeichnet vom Fragesteller
von KnusperPudding, Community-Experte für Java, 46

Ja hallo (wieder) - Schade, dass es leider mittlerweile keine neuen Details gab hinsichtlich deiner letzten Frage, was sich mit dem selben Thema befasst.

Sofern du nun Eclipse mit JDK 8 zum laufen gebracht hast, sollte dein ursprünglicher Code nämlich funktionieren. - Ich ändere allerdings den Pfad ab, da du von einer externen Datei ausgehst, zudem wäre für die anderen interessierten Antwort-Geber noch die Information relevant, dass du mit JavaFX arbeitest.

 public void start(Stage primaryStage) {
Media media = new Media("C:\\temp\\MeinSong.mp3");
MediaPlayer mediaPlayer = new MediaPlayer(media);
mediaPlayer.play();
primaryStage.setTitle("");//();setTitle("Audio Player 1");
primaryStage.setWidth(200);
primaryStage.setHeight(200);
primaryStage.show();
}


Sofern du JavaFX ausschließen möchtest, da es für dich nicht mehr relevant ist, gib bitte bescheid. Denn in so einem Falle wird das abspielen von MP3 Songs nämlich nicht mehr so trivial.


Sorry, aber nochmal zu deiner vorherigen Frage, ergänzend, da ich schlichtweg vermute, dass bei dir noch nicht auf das JDK 8 referenziert wird und du deshalb deinen Code nicht ausführen kannst. Hier ein Tutorial, dass dich hierbei unterstützt:

Kommentar von yeretor ,

Vorher hats halt meinen ganzen code für falsch befunden. Jetzt nichtmehr, ich bekomm bie diesem code:

package helloworld;

import javafx.application.Application;
import javafx.scene.media.Media;
import javafx.scene.media.MediaPlayer;
import javafx.stage.Stage;

public class HelloWorld extends Application {
public static void main(String[] args) {
HelloWorld hw = new HelloWorld();
Stage ps = new Stage();
hw.start(ps);

}

public void start(Stage primaryStage) {
Media media = new Media("D:\\Bsp.mp3");
MediaPlayer mediaPlayer = new MediaPlayer(media);
mediaPlayer.play();
primaryStage.setTitle("Title");//();setTitle("Audio Player 1");
primaryStage.setWidth(200);
primaryStage.setHeight(200);
primaryStage.show();
}
}

Diese vehlermeldung:

java.lang.reflect.InvocationTargetException
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:498)
at com.sun.javafx.application.LauncherImpl.launchApplicationWithArgs(LauncherImpl.java:389)
at com.sun.javafx.application.LauncherImpl.launchApplication(LauncherImpl.java:328)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:498)
at sun.launcher.LauncherHelper$FXHelper.main(LauncherHelper.java:767)
Caused by: java.lang.IllegalStateException: Not on FX application thread; currentThread = main
at com.sun.javafx.tk.Toolkit.checkFxUserThread(Toolkit.java:236)
at com.sun.javafx.tk.quantum.QuantumToolkit.checkFxUserThread(QuantumToolkit.java:423)
at javafx.stage.Stage.(Stage.java:241)
at javafx.stage.Stage.(Stage.java:227)
at helloworld.HelloWorld.main(HelloWorld.java:12)
... 11 more
Exception running application helloworld.HelloWorld
Kommentar von KnusperPudding ,

Suuper, dass es soweit geklappt hat.

Zu JavaFX ist anzumerken, dass du hier deine Methode nicht so starten solltest:

 HelloWorld hw = new HelloWorld();
Stage ps = new Stage();
hw.start(ps);

Rufe in deiner Main-Methode ganz einfach: launch auf.

public static void main (String[] args) {
    launch(args);
}

In deiner start() Methode muss der Player im FX-Application-Thread laufen. 

D.h. dann die entsprechende Stelle via Plattform.runlater() ausführen:

Platform.runLater(new Runnable() {
    @Override
    public void run() {
        Media media = new Media("file:///C:/temp/1.mp3");
        MediaPlayer mediaPlayer = new MediaPlayer(media);
        mediaPlayer.play();
    }
});
Kommentar von yeretor ,

NICE funktioniert SUPER. DAAAAAAAANKE!!!!!!!!!!!!!!

Kommentar von KnusperPudding ,

Freut mich. Super. Und danke für den Stern.

Kommentar von yeretor ,

... oder auch nicht. Es stoppt mein knapp 15 min. langes beispiel stück nach 15 sek. woran liegt das?

Kommentar von KnusperPudding ,

Das ist eher ungewöhnlich, dass es 'einfach so stoppt'. 

Schließt du den eventuell Die Scene? 

Gibt es eine Exception? 

Friert der Bildschirm ein? 

Kommentar von yeretor ,

nein, nichts von alledem.

erst erscheint ein kleines, weißes fenster, wo oben Titel steht, das stück started, hört 15 sec später wieder auf, fenster bleibt.

Kommentar von yeretor ,

ok, jetzt passt alles. sorry fürs nachfragen, ich bab auf stackoverflow einen thread dazu gefunden.(

http://stackoverflow.com/questions/6241687/mediaplayer-stop-playing-after-about-...

). man sollte andscheinend den media player vorher vereinbahren.

Kommentar von KnusperPudding ,

Vermutlich ist es das.

- Freut mich dass es für dich klapp. Viel Spass und Erfolg damit.

Kommentar von KnusperPudding ,

Offensichtlich ist die Ursache die Garbagecollection. Ich würde das sogar als Bug deklarieren. 

Nachdem der Player nur innerhalb einer Methode die Gültigkeit hat, wird diese dann automatisch weggeräumt, wenn Speicherbedarf besteht.

Die Deklaration der Variable als Statische/Instanz-Variable dürfte bereits für dich zur Lösung führen, ja.

Antwort
von janwelter, 59

Media constructor und den dann abspielen. Vorher noch in einen try Catch Block mit dem File constructor den Pfad festlegen

Antwort
von Bohne999, 44

Du kannst mit Hilfe des FileChoosers von JavaFX dir eine entsprechende .mp3 Datei in ein File Object abspeichern. Und dann einfach mit Hilfe der Media und der MediaPlayer Klasse diese abspielen. 

Keine passende Antwort gefunden?

Fragen Sie die Community