JavaFX AudioPlayer Playlistmodus

MaxG.

Bekanntes Mitglied
Hi,
ich habe mich daran versucht einen eigenen AudioPlayer zu programmieren. Dabei soll auch die Möglichkeit bestehen Playlisten abzuspielen. Das Problem ist aber dass wenn man auf den Skip Button drückt, der Player Probleme hat den nächsten titel zu spielen und die Anzeige zu updaten. Das ganze funktioniert so das man eine .playlist Datei auswählt (nichts anderes wie ein Textdokument in dem die Dateipfade der Songs stehen) und ein Media ArrayList befüllt wird. Dieses wird einem MediaPlayer ArrayList übergeben und über ArrayList.get(id) wird alles gesteuert. Da dabei keine Fehlermeldung auftritt weis ich nicht warum es nicht geht.
Woran könnte es liegen das er den nächsten titel und die Anzeige nicht updaten kann?

Code:
package gui;

import java.io.File;

import core.AudioPlayer;
import core.Playlist;
import javafx.application.Platform;
import javafx.beans.InvalidationListener;
import javafx.beans.Observable;
import javafx.beans.value.ChangeListener;
import javafx.beans.value.ObservableValue;
import javafx.event.ActionEvent;
import javafx.event.EventHandler;
import javafx.geometry.Insets;
import javafx.geometry.Pos;
import javafx.scene.Scene;
import javafx.scene.control.Button;
import javafx.scene.control.Label;
import javafx.scene.control.Menu;
import javafx.scene.control.MenuBar;
import javafx.scene.control.MenuItem;
import javafx.scene.control.Slider;
import javafx.scene.effect.Reflection;
import javafx.scene.image.Image;
import javafx.scene.image.ImageView;
import javafx.scene.layout.BorderPane;
import javafx.scene.layout.HBox;
import javafx.scene.layout.StackPane;
import javafx.scene.layout.VBox;
import javafx.scene.media.Media;
import javafx.scene.text.Font;
import javafx.scene.text.FontWeight;
import javafx.stage.FileChooser;
import javafx.stage.Stage;
import javafx.util.Duration;
import run.RunProgramm;

public class MainFrame extends Stage{

   
    BorderPane root;
    VBox controlBar;
    HBox controller;
    VBox info;
    StackPane thumbnail;
   
    Button playerButton;
    Button skipButton;
    Button backButton;
    Button reloadButton;
   
    ImageView imageView;
    Image image;
   
    Slider volumeControl;
    Slider durationControl;
   
    MenuBar menuBar;
    Menu file;
    Menu window;
    Menu about;
   
    MenuItem chooseTrack;
    MenuItem choosePlaylist;
    MenuItem playlistCreator;
    MenuItem aboutItem;
   
    Label time;
   
    boolean trackStatus = false;
    boolean playlistStatus = false;
    boolean pauseStatus = true;
    private int trackDurationMinute;
    private int trackDurationSeconds;
    private String trackDurationNullen;
   
    AudioPlayer audioPlayer;
    Playlist playlist;
    Duration duration;
   
   
    public MainFrame(){
       
        root = new BorderPane();
        root.setPadding(new Insets(0,1,10,1));
        root.setStyle("-fx-background-color: #7D7D7D ");
        controlBar = new VBox();
        controller = new HBox();
        controller.setPadding(new Insets(10,0,0,0));
        controller.setSpacing(5);
        controller.setAlignment(Pos.CENTER);
        info = new VBox();
        info.setSpacing(5);
        info.setAlignment(Pos.CENTER);
        thumbnail = new StackPane();
        thumbnail.setPadding(new Insets(0,0,20,0));
       
       
        menuBar = new MenuBar();
       
        file = new Menu("Datei");
        about = new Menu("Über");
        window = new Menu("Fenster");
       
        chooseTrack = new MenuItem("Lied auswählen");
        choosePlaylist = new MenuItem("Playliste auswählen");
        aboutItem = new MenuItem("über MG Audio");
        playlistCreator = new MenuItem("Playlist creator");
       
        file.getItems().addAll(chooseTrack, choosePlaylist);
        about.getItems().addAll(aboutItem);
        window.getItems().addAll(playlistCreator);
       
        menuBar.getMenus().addAll(file, about, window);
       
       
        playerButton = new Button();
        playerButton.setGraphic(new ImageView(new Image(RunProgramm.class.getResourceAsStream("play.png"))));
        playerButton.setStyle("-fx-background-color: #7D7D7D ");
        skipButton = new Button();
        skipButton.setGraphic(new ImageView(new Image(RunProgramm.class.getResourceAsStream("skip.png"))));
        skipButton.setStyle("-fx-background-color: #7D7D7D ");
        backButton = new Button();
        backButton.setGraphic(new ImageView(new Image(RunProgramm.class.getResourceAsStream("back.png"))));
        backButton.setStyle("-fx-background-color: #7D7D7D ");
        reloadButton = new Button();
        reloadButton.setGraphic(new ImageView(new Image(RunProgramm.class.getResourceAsStream("refresh.png"))));
        reloadButton.setStyle("-fx-background-color: #7D7D7D ");
       
       
        time = new Label();
        time.setFont(Font.font("Arial", FontWeight.BOLD, 25));
       
        image = new Image(RunProgramm.class.getResourceAsStream("disk.png"));
        imageView = new ImageView(image);
        thumbnail.getChildren().add(imageView);
       
        durationControl = new Slider();
        volumeControl = new Slider(0.0, 1.0, 0.5);
       
        controller.getChildren().addAll(reloadButton, backButton, playerButton, skipButton, volumeControl);
        controlBar.getChildren().addAll(durationControl, controller);
        info.getChildren().addAll(thumbnail, time);
        root.setCenter(info);
        root.setBottom(controlBar);
        root.setTop(menuBar);
        Scene scene = new Scene(root);
       
        this.setScene(scene);
        this.setMaximized(true);
        this.getIcons().add(new Image(RunProgramm.class.getResourceAsStream("speakers.png")));
        this.show();
       
       
        listener();
    }
   
    private void listener(){
        chooseTrack.setOnAction(new EventHandler<ActionEvent>() {
           
            @Override
            public void handle(ActionEvent arg0) {
                // TODO Auto-generated method stub
                FileChooser fileChooser = new FileChooser();
                FileChooser.ExtensionFilter extensionFilter = new FileChooser.ExtensionFilter("AudioFiles (*.mp3, *wav)", "*.mp3", "*.wav");
                fileChooser.getExtensionFilters().add(extensionFilter);
                File file = fileChooser.showOpenDialog(null);
               
                if (file != null) {
                    String mediaPath = file.getAbsolutePath().toString();
                    mediaPath = mediaPath.replace("\\", "/");

                    audioPlayer = new AudioPlayer(new Media(new File(mediaPath).toURI().toString()));
                    trackStatus = true;
                    playlistStatus = false;
                    durationListener();

                    thumbnail.getChildren().clear();
                    thumbnail.getChildren().add(audioPlayer.getThumbnail());
                    audioPlayer.setVolume(volumeControl.getValue());
                }

            }
        });
       
        choosePlaylist.setOnAction(new EventHandler<ActionEvent>() {

            @Override
            public void handle(ActionEvent arg0) {
                // TODO Auto-generated method stub
                FileChooser fileChooser = new FileChooser();
                FileChooser.ExtensionFilter extensionFilter = new FileChooser.ExtensionFilter("Playlists (*.playlist)", "*.playlist");
                fileChooser.getExtensionFilters().add(extensionFilter);
                File file = fileChooser.showOpenDialog(null);
               
                if(file != null){
                    String mediaPath = file.getAbsolutePath().toString();
                    mediaPath = mediaPath.replace("\\", "/");

                    playlist = new Playlist(mediaPath);

                    trackStatus = false;
                    playlistStatus = true;

                    thumbnail.getChildren().clear();
                    thumbnail.getChildren().add(playlist.getThumbnail());
                    playlist.setVolume(volumeControl.getValue());
                    durationListener();
                }
               
            }
        });
       
        aboutItem.setOnAction(new EventHandler<ActionEvent>() {

            @Override
            public void handle(ActionEvent arg0) {
                // TODO Auto-generated method stub
                AboutStage aboutStage = new AboutStage();
            }
        });
       
        playlistCreator.setOnAction(new EventHandler<ActionEvent>() {

            @Override
            public void handle(ActionEvent arg0) {
                // TODO Auto-generated method stub
                PlaylistCreator creator = new PlaylistCreator();
            }
        });
       
       
        playerButton.setOnAction(new EventHandler<ActionEvent>() {

            @Override
            public void handle(ActionEvent arg0) {
                // TODO Auto-generated method stub
                if(trackStatus){
                    if(pauseStatus){
                        audioPlayer.play();
                        playerButton.setGraphic(new ImageView(new Image(RunProgramm.class.getResourceAsStream("pause.png"))));
                        pauseStatus = false;
                    }else{
                        audioPlayer.pause();
                        playerButton.setGraphic(new ImageView(new Image(RunProgramm.class.getResourceAsStream("play.png"))));
                        pauseStatus = true;
                    }
                   
                }
               
                if (playlistStatus) {
                    if (pauseStatus) {
                        playlist.play();
                        playerButton.setGraphic(new ImageView(new Image(RunProgramm.class.getResourceAsStream("pause.png"))));
                        pauseStatus = false;
                    } else {
                        playlist.pause();
                        playerButton.setGraphic(new ImageView(new Image(RunProgramm.class.getResourceAsStream("play.png"))));
                        pauseStatus = true;
                    }

                }
            }
        });
       
        skipButton.setOnAction(new EventHandler<ActionEvent>() {

            @Override
            public void handle(ActionEvent arg0) {
                // TODO Auto-generated method stub
                if(playlistStatus){
                    playlist.skip();
                    thumbnail.getChildren().clear();
                    thumbnail.getChildren().add(playlist.getThumbnail());
                }
            }
        });

        backButton.setOnAction(new EventHandler<ActionEvent>() {

            @Override
            public void handle(ActionEvent arg0) {
                // TODO Auto-generated method stub
                if (playlistStatus) {
                    playlist.back();
                    thumbnail.getChildren().clear();
                    thumbnail.getChildren().add(playlist.getThumbnail());
                }
            }
        });
       
       
        reloadButton.setOnAction(new EventHandler<ActionEvent>() {

            @Override
            public void handle(ActionEvent arg0) {
                // TODO Auto-generated method stub
                if (trackStatus) {
                    audioPlayer.seek(new Duration(0));
                }
                if(playlistStatus){
                    playlist.seek(new Duration(0));
                }
            }
        });
       
       
        volumeControl.valueProperty().addListener(new InvalidationListener() {

            @Override
            public void invalidated(Observable arg0) {
                // TODO Auto-generated method stub
                if (trackStatus) {
                    audioPlayer.setVolume(volumeControl.getValue());
                }
                if (playlistStatus) {

                }
            }
        });
       
        durationControl.valueProperty().addListener(new InvalidationListener() {
           
            @Override
            public void invalidated(Observable arg0) {
                // TODO Auto-generated method stub
                if (trackStatus) {
                    if (durationControl.isValueChanging()) {
                        if (durationControl != null) {
                            audioPlayer.seek(duration.multiply(durationControl.getValue() / 100.0));
                        }
                    }
                }
                if (playlistStatus) {
                    if (durationControl.isValueChanging()) {
                        if (durationControl != null) {
                            playlist.mediaPlayer.get(playlist.getCurrentMedia()).seek(duration.multiply(durationControl.getValue() / 100.0));
                        }
                    }
                }
            }
        });

    }

    private void durationListener() {
       
        if (trackStatus) {
            audioPlayer.player.currentTimeProperty().addListener(new ChangeListener<Duration>() {

                @Override
                public void changed(ObservableValue<? extends Duration> observable, Duration oldValue,
                        Duration newValue) {
                    updateDuration();

                }
            });

            audioPlayer.player.currentTimeProperty().addListener((Observable ov) -> {
                updateDuration();
            });

            audioPlayer.player.setOnReady(() -> {
                duration = audioPlayer.player.getMedia().getDuration();
                trackDurationMinute = (int) duration.toMinutes();
                trackDurationSeconds = (int) duration.toSeconds();
                if (trackDurationMinute >= 1) {
                    int devide = trackDurationMinute * 60;
                    trackDurationSeconds = trackDurationSeconds - devide;
                }

                if (trackDurationSeconds < 10) {
                    trackDurationNullen = "0";
                } else {
                    trackDurationNullen = "";
                }

                updateDuration();
            });
        }
       
        if (playlistStatus) {

            playlist.mediaPlayer.get(playlist.getCurrentMedia()).currentTimeProperty().addListener(new ChangeListener<Duration>() {

                        @Override
                        public void changed(ObservableValue<? extends Duration> observable, Duration oldValue, Duration newValue) {
                            updateDuration();

                        }
                    });

            playlist.mediaPlayer.get(playlist.getCurrentMedia()).currentTimeProperty().addListener((Observable ov) -> {
                updateDuration();
            });

            playlist.mediaPlayer.get(playlist.getCurrentMedia()).setOnReady(() -> {
                duration = playlist.mediaPlayer.get(playlist.getCurrentMedia()).getMedia().getDuration();
                trackDurationMinute = (int) duration.toMinutes();
                trackDurationSeconds = (int) duration.toSeconds();
                if (trackDurationMinute >= 1) {
                    int devide = trackDurationMinute * 60;
                    trackDurationSeconds = trackDurationSeconds - devide;
                }

                if (trackDurationSeconds < 10) {
                    trackDurationNullen = "0";
                } else {
                    trackDurationNullen = "";
                }

                updateDuration();
            });
        }

    }
   
    private void updateDuration(){

        if (trackStatus) {
            if (time != null && duration != null) {
                Platform.runLater(new Runnable() {
                    public void run() {
                        Duration currentTime = audioPlayer.player.getCurrentTime();
                        int minutes = (int) currentTime.toMinutes();
                        int seconds;
                        String nullen;

                        if (minutes >= 1) {
                            seconds = (int) currentTime.toSeconds();
                            int devide = minutes * 60;
                            seconds = seconds - devide;

                        } else {
                            seconds = (int) currentTime.toSeconds();
                        }

                        if (seconds < 10) {
                            nullen = "0";
                        } else {
                            nullen = "";
                        }

                        time.setText(minutes + ":" + nullen + seconds + " / " + trackDurationMinute + ":" + trackDurationNullen + trackDurationSeconds);
                        durationControl.setDisable(duration.isUnknown());
                        if (!durationControl.isDisabled() && duration.greaterThan(Duration.ZERO) && !durationControl.isValueChanging()) {
                            durationControl.setValue(currentTime.divide(duration).toMillis() * 100.0);
                        }
                    }
                });
            }
        }else{
            if (time != null && duration != null) {
                Platform.runLater(new Runnable() {
                    public void run() {
                        Duration currentTime = playlist.mediaPlayer.get(playlist.getCurrentMedia()).getCurrentTime();
                        int minutes = (int) currentTime.toMinutes();
                        int seconds;
                        String nullen;

                        if (minutes >= 1) {
                            seconds = (int) currentTime.toSeconds();
                            int devide = minutes * 60;
                            seconds = seconds - devide;

                        } else {
                            seconds = (int) currentTime.toSeconds();
                        }

                        if (seconds < 10) {
                            nullen = "0";
                        } else {
                            nullen = "";
                        }

                        time.setText(minutes + ":" + nullen + seconds + " / " + trackDurationMinute + ":" + trackDurationNullen + trackDurationSeconds);
                        durationControl.setDisable(duration.isUnknown());
                        if (!durationControl.isDisabled() && duration.greaterThan(Duration.ZERO) && !durationControl.isValueChanging()) {
                            durationControl.setValue(currentTime.divide(duration).toMillis() * 100.0);
                        }
                    }
                });
            }
        }

    }
}

Code:
package core;

import java.io.BufferedReader;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.util.ArrayList;

import javafx.collections.MapChangeListener;
import javafx.collections.MapChangeListener.Change;
import javafx.scene.effect.Reflection;
import javafx.scene.image.Image;
import javafx.scene.image.ImageView;
import javafx.scene.media.Media;
import javafx.scene.media.MediaPlayer;
import javafx.util.Duration;

public class Playlist {
   
    ArrayList<Media> media = new ArrayList<Media>();
    public ArrayList<MediaPlayer> mediaPlayer = new ArrayList<MediaPlayer>();
   
    private ImageView thumbnail;
    private String title;
    private String artist;
    private String album;
    private String year;
    boolean playerStatus = false;

    int size;
    int currentCount = 0;
    int nextCount = 1;
   
    public Playlist(String path){
        final Reflection reflection = new Reflection();
        reflection.setFraction(0.2);
       
        thumbnail = new ImageView();
        thumbnail.setFitWidth(240);
        thumbnail.setPreserveRatio(true);
        thumbnail.setSmooth(true);
        thumbnail.setEffect(reflection);
       
        try{
            InputStream inputStream = new FileInputStream(new File(path));
            BufferedReader reader = new BufferedReader(new InputStreamReader(inputStream));
           
            String line;
            while((line = reader.readLine()) != null){
                line = line.replace("\\", "/");
                media.add(new Media(new File(line).toURI().toString()));
            }
           
        }catch(IOException e){
           
        }
       
       
        size = media.size();
       
        for(int i = 0; i< size; i++){
            MediaPlayer player = new MediaPlayer(media.get(i));
            player.stop();
            mediaPlayer.add(player);
        }
       
        media.get(currentCount).getMetadata().addListener(new MapChangeListener<String, Object>() {
            @Override
            public void onChanged(Change<? extends String, ? extends Object> ch) {
                if (ch.wasAdded()) {
                    handleMetadata(ch.getKey(), ch.getValueAdded());
                }
            }
        });
        playerStatus = true;
    }
   
    public void play() {
        if (playerStatus && currentCount <= size) {
            mediaPlayer.get(currentCount).play();
            media.get(currentCount).getMetadata().addListener(new MapChangeListener<String, Object>() {
                @Override
                public void onChanged(Change<? extends String, ? extends Object> ch) {
                    if (ch.wasAdded()) {
                        handleMetadata(ch.getKey(), ch.getValueAdded());
                    }
                }
            });
        }
    }

    public void pause(){
        if(playerStatus && currentCount <= size){
            mediaPlayer.get(currentCount).pause();
            media.get(currentCount).getMetadata().addListener(new MapChangeListener<String, Object>() {
                @Override
                public void onChanged(Change<? extends String, ? extends Object> ch) {
                    if (ch.wasAdded()) {
                        handleMetadata(ch.getKey(), ch.getValueAdded());
                    }
                }
            });
        }
    }
   
    public void stop(){
        if(playerStatus && currentCount <= size){
            mediaPlayer.get(currentCount).stop();
            media.get(currentCount).getMetadata().addListener(new MapChangeListener<String, Object>() {
                @Override
                public void onChanged(Change<? extends String, ? extends Object> ch) {
                    if (ch.wasAdded()) {
                        handleMetadata(ch.getKey(), ch.getValueAdded());
                    }
                }
            });
        }
    }
   
    public void skip(){
        nextCount = currentCount;
        nextCount ++;
        if(playerStatus && nextCount < size){
            mediaPlayer.get(currentCount).stop();
            mediaPlayer.get(nextCount).play();
            media.get(nextCount).getMetadata().addListener(new MapChangeListener<String, Object>() {
                @Override
                public void onChanged(Change<? extends String, ? extends Object> ch) {
                    if (ch.wasAdded()) {
                        handleMetadata(ch.getKey(), ch.getValueAdded());
                    }
                }
            });
            currentCount = nextCount;
        }
    }
   
    public void back(){
        if(playerStatus && currentCount > 0){
            mediaPlayer.get(currentCount).stop();
            currentCount --;
            mediaPlayer.get(currentCount).play();
            System.out.println("MediaSkip" + currentCount);
            media.get(currentCount).getMetadata().addListener(new MapChangeListener<String, Object>() {
                @Override
                public void onChanged(Change<? extends String, ? extends Object> ch) {
                    if (ch.wasAdded()) {
                        handleMetadata(ch.getKey(), ch.getValueAdded());
                    }
                }
            });
        }
    }
   
    public void seek(Duration duration){
        if(playerStatus && currentCount <= size){
            mediaPlayer.get(currentCount).seek(duration);
        }
    }
   
    public void setVolume(double volume){
        if(playerStatus && currentCount <= size){
            mediaPlayer.get(currentCount).setVolume(volume);;
        }
    }
   
    public String getAlbum(){
        return album;
    }
   
    public String getArtist(){
        return artist;
    }
   
    public String getTitle(){
        return title;
    }
   
    public String getYear(){
        return year;
    }
   
    public ImageView getThumbnail(){
        return thumbnail;
    }
   
    public int getCurrentMedia(){
        return currentCount;
    }
   
   
    private void handleMetadata(String key, Object value) {
        if (key.equals("album")) {
            album = value.toString();
        } else if (key.equals("artist")) {
            artist = value.toString();
        }
        if (key.equals("title")) {
            title = value.toString();
        }
        if (key.equals("year")) {
            year = value.toString();
        }
        if (key.equals("image")) {
            thumbnail.setImage((Image) value);
        }
    }

}
 

dzim

Top Contributor
Ehrlich? Keine Ahnung. Ich schau mir allerdings auch nicht so gerne JavaFX-Code an, der im Swing-Stil geschrieben ist. ;)
Deine Beschreibung ist mir auch etwas zu vage. Vielleicht kannst du dein Problem ja einmal auf ein minimales Beispiel (eine Klasse inkl. main) zusammenstauchen. Dann würde ich es auch mal ausprobieren. Im Moment müsste ich noch zu viel "ringsrum" selbst schreiben, da hab ich gerade kein Interesse dran.
 
Ähnliche Java Themen

Ähnliche Java Themen

Neue Themen


Oben