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

Java Java Detekování dohrání skladby v musicPlayer (v JavaFX)

Avatar
Vojtěch Bešťák:

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. května 17:49
Avatar
Odpovídá na Vojtěch Bešťák
Petr Štechmüller:

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. května 18:12
Pokud spolu kód a komentář nekorespondují, budou patrně oba chybné
Avatar
Odpovídá na Petr Štechmüller
Vojtěch Bešťák:

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. května 18:17
Avatar
Odpovídá na Vojtěch Bešťák
Petr Štechmüller:

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

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

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. května 18:50
Avatar
Odpovídá na Vojtěch Bešťák
Petr Štechmüller:
// 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í
+1 bodů
Řešení problému
Nahoru Odpovědět 23. května 19:27
Pokud spolu kód a komentář nekorespondují, budou patrně oba chybné
Avatar
Odpovídá na Petr Štechmüller
Vojtěch Bešťák:

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. května 20:24
Avatar
Odpovídá na Vojtěch Bešťák
Petr Štechmüller:

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. května 20:41
Pokud spolu kód a komentář nekorespondují, budou patrně oba chybné
Avatar
Vojtěch Bešťák:

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. května 17:11
Avatar
Odpovídá na Vojtěch Bešťák
Petr Štechmüller:

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. května 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.