IT rekvalifikace s garancí práce. Seniorní programátoři vydělávají až 160 000 Kč/měsíc a rekvalifikace je prvním krokem. Zjisti, jak na to!
Hledáme nové posily do ITnetwork týmu. Podívej se na volné pozice a přidej se do nejagilnější firmy na trhu - Více informací.
Mezi 13:00 až cca 16:00 proběhne odstávka sítě z důvodu aktualizace. Web bude po celou dobu nedostupný.

Diskuze: Detekování dohrání skladby v musicPlayer (v JavaFX)

Aktivity
Avatar
Vojtěch Bešťák:23.5.2016 17:49

Zdravím, chtěl jsem se zeptat, je nějaký způsob jak zjistit, zda-li skladba v musicPlayeru již dohrála a v případě že ano, nějak na to reagovat?

Pro načtení skladby používám toto:

String musicFileSong = "song.wav";
Media sound = new Media(new File(musicFilecSong).toURI().toString());
MediaPlayer song = new MediaPlayer(sound);

a pro pozdější spuštění skladby:

song.play();
 
Odpovědět
23.5.2016 17:49
Avatar
Odpovídá na Vojtěch Bešťák
Petr Štechmüller:23.5.2016 18:12

Ahoj, stačily mi 3 vteřiny na googlu...
http://stackoverflow.com/a/11601256

Výtřžek z odkazu na kód řešení

final MediaPlayer nextPlayer = players.get((i + 1) % players.size());
      player.setOnEndOfMedia(new Runnable() {
        @Override public void run() {
          player.currentTimeProperty().removeListener(progressChangeListener);
          player.getMedia().getMetadata().removeListener(metadataChangeListener);
          player.stop();
          mediaView.setMediaPlayer(nextPlayer);
          nextPlayer.play();
        }
      });
Nahoru Odpovědět
23.5.2016 18:12
Pokud spolu kód a komentář nekorespondují, budou patrně oba chybné
Avatar
Odpovídá na Petr Štechmüller
Vojtěch Bešťák:23.5.2016 18:17

Neporadil by jsi mi prosím, jak to zaimplementovat do mého existujícího kódu? Nejsem zas tak dobrý... :( :D

 
Nahoru Odpovědět
23.5.2016 18:17
Avatar
Odpovídá na Vojtěch Bešťák
Petr Štechmüller:23.5.2016 18:22

No až sem nějaký zdrojový kód hodíš, tak uvidím, co se dá dělat :D

Nahoru Odpovědět
23.5.2016 18:22
Pokud spolu kód a komentář nekorespondují, budou patrně oba chybné
Avatar
Odpovídá na Petr Štechmüller
Vojtěch Bešťák:23.5.2016 18:50

Programuji počítadlo, s odpočtem 5 minut. Celou tu metodu "handlespustit­CasButtonActi­on", který detekuje zmáčknutí tlačítka bych potřeboval nahradit detekováním, zda-li ten "goalSong1" již dohrál...

    private int countDownSeconds = 4; // bude se odpočítávat od 3 do -1
    private StringProperty countDownValue = new SimpleStringProperty(countDownSeconds + "");

    @FXML
    private void handlespustitCasButtonAction(ActionEvent event)
    {
        countdownLabel.setVisible(true);
        startSequenceSPlay();
        startButton.setVisible(false);
        zadatOsobyButton.setVisible(false);
        countDownValue.setValue("3");

        Timeline countdown = new Timeline(new KeyFrame(Duration.seconds(1), (e) -> {
            int i = Integer.parseInt(countDownValue.getValue()) - 1;
            countDownValue.setValue(i + "");
            if (i == 0)
            {
                int s = Integer.parseInt(casSekundyValue.getValue());
                int m = Integer.parseInt(casMinutyValue.getValue());
                if(s <= 33 && m == 0)
                    {
                        countdownSPlay();
                    }
                countdownLabel.setVisible(false);
                startTimeLine();
                enableGoalButtons();
            }
            if (i == -1)
            {
                startSequenceSStop();
            }
}));


        countdown.setCycleCount(countDownSeconds);
        countdown.play();
        spustitCasButton.setDisable(true);
        goalSongStop();
    }

        String musicFilecountdown = "countdown.wav";
    Media sound = new Media(new File(musicFilecountdown).toURI().toString());
    MediaPlayer countdownSong = new MediaPlayer(sound);

        public void goalSongPlay()
    {
        goalSong1.play();
    }
 
Nahoru Odpovědět
23.5.2016 18:50
Avatar
Odpovídá na Vojtěch Bešťák
Petr Štechmüller:23.5.2016 19:27
// pokud je toto kód kontroleru, tak to narvi někam do metody initializable (nebo jak se to jmenuje)
countdownSong .setOnEndOfMedia(new Runnable() {
        @Override public void run() {
          // obsah metody handlespustitCasButtonAction
        }
      });
Akceptované řešení
+20 Zkušeností
+2,50 Kč
Řešení problému
Nahoru Odpovědět
23.5.2016 19:27
Pokud spolu kód a komentář nekorespondují, budou patrně oba chybné
Avatar
Odpovídá na Petr Štechmüller
Vojtěch Bešťák:23.5.2016 20:24

Zdravím, mám ještě jeden takový malý dotaz k MusicPlayeru.
Vytvořil jsem si databázi, který náhodně vybere jednu ze dvou skladeb v ní.
Ovšem jenom jednou, na úplném začátku programu, to znamená že kdykoliv tu skladbu pustím, již se náhodně nevybere, ale hraje pořád stejná, protože se vybrala jednorázově.
A také zároveň ji stále potřebuji testovat, zda neskončila.
Zde je kód:

    String databaze[] = {"Avicii - Levels.wav", "Avicii - Wake Me Up.wav"};
    String musicFileGoalSong = databaze[(int)(Math.random()*databaze.length)];
    Media sound7 = new Media(new File(musicFileGoalSong).toURI().toString());
    MediaPlayer goalSong = new MediaPlayer(sound7);

    public void goalSongPlay()
    {
        goalSong.play();
    }
    public void goalSongStop()
    {
        goalSong.stop();
    }



    @Override
    public void initialize(URL url, ResourceBundle rb) {

    goalSong.setOnEndOfMedia(new Runnable() {
        @Override public void run() {
        odpocet321();
        }
      });
}

Poradíš mi tedy prosím, jak to mám udělat, že před každým zahráním písničky se náhodně vybere jedna...

 
Nahoru Odpovědět
23.5.2016 20:24
Avatar
Odpovídá na Vojtěch Bešťák
Petr Štechmüller:23.5.2016 20:41

Ta samá píšnička ti hraje kvůli tomuto řádku:

String musicFileGoalSong = databaze[(int)(Math.random()*databaze.length)];
Media sound7 = new Media(new File(musicFileGoalSong).toURI().toString());
MediaPlayer goalSong = new MediaPlayer(sound7);

Zde napevno nastavíš, název písničky. Cílem tedy bude toto nastavení udělat dynamicky.

Přepoklám, že tu skladbu pouštíš po stisku nějakáho tlačítka. V nejjednodušším případě přidáš do obslužné metody něco jako toto:

musicFileGoalSong = databaze[(int)(Math.random()*databaze.length)];
sound7 = new Media(new File(musicFileGoalSong).toURI().toString());
goalSong = new MediaPlayer(sound7);

a všechno by mělo fungovat tak, jak si představuješ.

Nahoru Odpovědět
23.5.2016 20:41
Pokud spolu kód a komentář nekorespondují, budou patrně oba chybné
Avatar
Vojtěch Bešťák:24.5.2016 17:11

Když jsem to přidal do metody spouštění písničky...

String databaze[] = {"Avicii - Levels.wav", "Avicii - Wake Me Up.wav"};
String musicFileGoalSong = databaze[(int)(Math.random()*databaze.length)];
Media sound7 = new Media(new File(musicFileGoalSong).toURI().toString());
MediaPlayer goalSong = new MediaPlayer(sound7);

public void goalSongPlay()
{
    musicFileGoalSong = databaze[(int)(Math.random()*databaze.length)];
    sound7 = new Media(new File(musicFileGoalSong).toURI().toString());
    goalSong = new MediaPlayer(sound7);
    goalSong.play();
}

@Override
public void initialize(URL url, ResourceBundle rb) {
goalSong.setOnEndOfMedia(new Runnable() {
    @Override public void run() {
    countdown321();
    System.out.println("ted");
    }
  });
}

již se nespustilo detekování, když písnička dohraje...

Když jsem si ale přidal tlačítko, které dělalo to samé, co se dělo po dohrání písničky, tak se ta písnička vybírala náhodně při každém spuštění ;)
Ovšem nevím jak udělat, aby to detekování konce zase fungovalo :( :D

 
Nahoru Odpovědět
24.5.2016 17:11
Avatar
Odpovídá na Vojtěch Bešťák
Petr Štechmüller:24.5.2016 17:53

Problém je jasny, v tom tlačítku vytváříš nové instance třídy MediaPlayer, která neví, že má nějak reagovat po skončení přehrávání. Vypadá to, že vůbec nechápeš, jak to všechno vlastně funguje...

public void goalSongPlay()
{
    musicFileGoalSong = databaze[(int)(Math.random()*databaze.length)];
    sound7 = new Media(new File(musicFileGoalSong).toURI().toString());
    goalSong = new MediaPlayer(sound7);

        goalSong.setOnEndOfMedia(new Runnable() {
            @Override public void run() {
            countdown321();
            System.out.println("ted");
            }
          });

    goalSong.play();
}

Ale už z toho začíná být celkem slušná šílenost. Nepřemýšlel jsi někdy o nějaké vícevrstvé architektuře?

Nahoru Odpovědět
24.5.2016 17:53
Pokud spolu kód a komentář nekorespondují, budou patrně oba chybné
Děláme co je v našich silách, aby byly zdejší diskuze co nejkvalitnější. Proto do nich také mohou přispívat pouze registrovaní členové. Pro zapojení do diskuze se přihlas. Pokud ještě nemáš účet, zaregistruj se, je to zdarma.

Zobrazeno 12 zpráv z 12.