tutorials.de Buch-Aktion 02/2012
ERLEDIGT
JA
ANTWORTEN
2
ZUGRIFFE
965
EMPFEHLEN
  • An Twitter übertragen
  • An Facebook übertragen
AUF DIESES THEMA
ANTWORTEN
  1. #1
    Maddin Maddin ist offline Mitglied Silber
    Registriert seit
    Jul 2010
    Beiträge
    66
    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:
    Code java:
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    
    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:
    Code java:
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    
                    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:
    Code java:
    1
    2
    3
    4
    5
    6
    7
    8
    
    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
     

  2. #2
    Maddin Maddin ist offline Mitglied Silber
    Registriert seit
    Jul 2010
    Beiträge
    66
    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
     

  3. #3
    Maddin Maddin ist offline Mitglied Silber
    Registriert seit
    Jul 2010
    Beiträge
    66
    Hab mich jetzt nach längerer Zeit mal wieder mit dem Thema beschäftigt...

    Wen die Lösung interessiert:
    1. Steuerung über Slider
    Code java:
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    
    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:
    Code java:
    1
    2
    3
    
    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
     

Ähnliche Themen

  1. nächsten Eintrag automatisch finden
    Von Steusi im Forum Relationale Datenbanksysteme
    Antworten: 2
    Letzter Beitrag: 19.01.09, 17:00
  2. Mc automatisch rückwärts abspielen
    Von nbeyond im Forum Flash Plattform
    Antworten: 3
    Letzter Beitrag: 19.10.08, 15:29
  3. swf wie eine flv abspielen und steuern
    Von drsoa im Forum Flash Plattform
    Antworten: 1
    Letzter Beitrag: 29.08.08, 21:42
  4. Song aus einer ListBox abspielen
    Von mathon im Forum Javascript & Ajax
    Antworten: 1
    Letzter Beitrag: 15.09.06, 05:50
  5. abspielen von avi / video mit keys framegenau steuern?
    Von piXel-issue im Forum Cinema 4D
    Antworten: 11
    Letzter Beitrag: 22.03.05, 20:00