JMF über JSlider steuern & automatisch nächsten Song abspielen

Maddin

Mitglied
Hallo,

Ich hab mit dem Tutorial von thomasbe (http://www.tutorials.de/forum/java-tutorials/330869-java-media-framework.html) jetzt einen Player zusammengebastelt mit schöner Oberfläche, Wiedergabeliste etc.
Momentan häng ich dabei noch an 2 Problemen und komm damit einfach nicht weiter, weil ich auch online nichts finde...

1. Steuerung über einen Slider
Das erste Problem ist, dass ich einen JSlider hab, welcher den Fortschritt des Songs repräsentiert. Zu dieser Umsetzung habe ich auch das Beispiel aus dem Tutorial verwendet und es entsprechend abgeändert.
Nun soll man aber über diesen Slider auch manuell den Fortschritt setzen können.
Allerdings startet er den Song jedes mal von vorne...

Relevanter Code:
Java:
public void play() {
		if(player != null)
		player.stop(); //sollte schon etwas laufen

		try {
			player = Manager.createRealizedPlayer(new File(songPfad).toURI().toURL()); //Player mit dem Pfad neu setzen

			songLänge = (int) player.getDuration().getSeconds(); //Länge ermitteln
			
			player.setMediaTime(pausiertZeit); //sollte vorher pausiert worden sein
			
			player.start(); //setzen
			stop = false; //ist ein in den Attributen definierter boolean
			
			refresherThread = new Thread() { //Thread, der alle 100ms das refresherRunnable aufruft
	            {
	                setPriority(Thread.MIN_PRIORITY);
	            }
	            public void run() {
	                try {
	                    while ((refresherRunnable != null) && (!stop) && (!isInterrupted())) {
	                        SwingUtilities.invokeLater(refresherRunnable);
	                        sleep(100);
	                    }                                       
	                } 
	                catch (InterruptedException e) {
	                    e.printStackTrace();
	                }
	            }
	        };
	        //Runnable Thread
	        refresherRunnable = new Runnable() { //Runnable, welches den fortschrittSlider sowie die beiden Slider aktualisiert
	            public void run() {
	            	int fortschritt = (int)player.getMediaTime().getSeconds();
	            	int position = (100*fortschritt)/songLänge; //Berechnung der Position auf dem Slider
	                fortschrittSlider.setValue(position); //Setzen
	            }
	        };
	        refresherThread.start(); //Thread starten

Ansätze waren bisher: ChangeListener, was allerdings mit dem "nur" 100-millisekündlichen Update und dem daraus resultierenden ständigen Neu-Setzen der Zeit zu unerwünschten Problemen führt
Außerdem hab ich's mit einem MouseListener versucht, das sieht momentan so aus:
Java:
                fortschrittSlider = new JSlider(); //wurde auch schon mit private JSlider fortschrittSlider; in den Attributen definiert
		fortschrittSlider.setValue(0);

		fortschrittSlider.addMouseListener(new MouseAdapter() {
			public void mouseReleased(MouseEvent evt) {
				stop=true; //refresherThread anhalten, da der Slider sonst jedes Mal neu bewegt wird
				refresherThread.interrupt();
				zeitSetzen(fortschrittSlider.getValue());
			}
			public void mouseClicked(MouseEvent evt) {
				stop=true; //refresherThread anhalten, da der Slider sonst jedes Mal neu bewegt wird
				refresherThread.interrupt();
				zeitSetzen(fortschrittSlider.getValue());
			}
		});

Letztendlich die Methode, in der die Zeit gesetzt werden soll:
Java:
public void zeitSetzen(int wert) {
		player.stop(); //anhalten
		
		long zeit = songLänge * wert* 10; //Zeitberechnung (eigentlich wert/100), aber da Time die Millisekunden verlangt, *10
		pausiertZeit = new Time(zeit); //new Time(Millisekunden)
		
		play(); //wieder starten
	}

Wie gesagt, springt er nun beim Klick immer auf 0 zurück.. Vielleicht steh ich auch nur auf der Leitung und hab bei der Berechnung was falsch gemacht oder derartiges.

Wenn jemand einen Tipp (gern auch mehrere) für mich hat, wäre ich sehr froh, diesen zu hören.


2. Automatisch nächsten Song abspielen
Nun soll der Player auch automatisch den nächsten Song abspielen können.
Hierfür überlege ich noch über den passenden Ansatz.

Da ich in der API nichts entsprechendes gelesen habe (außer vielleicht der Controller, welcher mir aber auch nicht geeignet erscheint), habe ich mir gedacht, dass es das simpelste wäre, einen Timer mitlaufen zu lassen, der dann am Songende den nächsten aufruft.
Gibt es da eine bessere Lösung bzw. gar eine Methode des JMF?


Ich bin für jegliche Hinweise, Tips etc. dankbar; Vielen Dank im Voraus!


Gruß,
Martin
 
Hi nochmal,

hat denn keiner eine Idee? Hab in der Zwischenzeit leider immer noch keine Lösung gefunden und wär um eine solche umso dankbarer...
Danke im Voraus für (hoffentlich kommende) Antworten.

Gruß,
Martin
 
Hab mich jetzt nach längerer Zeit mal wieder mit dem Thema beschäftigt...

Wen die Lösung interessiert:
1. Steuerung über Slider
Java:
public void zeitSetzen(int prozent) {
		player.stop(); //erstmal Player anhalten

		/* Zeitberechnung */
		double doubleprozent = (double)prozent/100;
		double neueZeit = (songLänge * doubleprozent);
		pausiertZeit = new Time(neueZeit); //Zeit setzen
		
		play(); //neustarten
//Anmerkung: bei play() wird dem Player die pausiertZeit übergeben und gesetzt,
//wodurch das Ändern der Zeit letztendlich realisiert wird.
}
Das Problem hatte am Schluss auch etwas mit der Berechnung via Integer und double zu tun.

2. Automatisch nächsten Song abspielen
Hierfür gibt es zwar laut API ein Event, jedoch erschien mir die Variante über den Timer dann doch einfacher:
Java:
nächsterSongTimer = new Timer((int) (songLänge-pausiertZeit.getSeconds())*1000, this); //Timer mit (verbleibender) Zeit (ms) erstellen
//Ist die pausierte Zeit 0, so wird einfach die songLänge verwendet, was meistens der Fall ist
nächsterSongTimer.start(); //starten


Gruß,
Martin
 
Zurück