2013-12-14 23 views
1

這是我關於JavaFX的第二個問題。我很抱歉,因爲我不是一個有經驗的Java程序員,也不是JavaFX的新手。我不明白以前的答案,並會在稍後再讀一遍。但是現在我有下一個問題。我重寫我的程序如下:如何同步播放多段mp3的片段?

import java.io.FileNotFoundException; 
import java.io.IOException; 
import static java.lang.Thread.sleep; 
import java.util.concurrent.TimeUnit; 
import javafx.application.Application; 
import javafx.scene.media.Media; 
import javafx.scene.media.MediaPlayer; 
import javafx.stage.Stage; import javafx.util.Duration; 

public class JavaFXMediaPlayer05 extends Application { 

    public static void main(String[] args) { 
     launch(args); 
    } 

    @Override 
    public void start(Stage stage) throws FileNotFoundException,IOException, InterruptedException { 
     Media media = new Media("file:///D:/1016_00.mp3"); 
//Set and play the first fragment of mp3-file 
     MediaPlayer mediaPlayer1 = new MediaPlayer(media); 
     mediaPlayer1.setStartTime(Duration.millis(1219.0)); 
     mediaPlayer1.setStopTime(Duration.millis(2728.0)); 
     mediaPlayer1.play(); 
     System.out.println("1st fragment played!"); 
     TimeUnit.SECONDS.sleep(3); 
//Set and play the second fragment 
     MediaPlayer mediaPlayer2 = new MediaPlayer(media); 
     mediaPlayer2.setStartTime(Duration.millis(3947.0)); 
     mediaPlayer2.setStopTime(Duration.millis(6629.0)); 
     mediaPlayer2.play(); 
     System.out.println("2nd fragment played!"); 
     TimeUnit.SECONDS.sleep(3); 
//Set and play the third fragment 
     MediaPlayer mediaPlayer3 = new MediaPlayer(media); 
     mediaPlayer3.setStartTime(Duration.millis(7453.0)); 
     mediaPlayer3.setStopTime(Duration.millis(10704.0)); 
     mediaPlayer3.play(); 
     System.out.println("3rd fragment played!"); 
//Just sleep 
     System.out.println("pre-sleep"); 
     TimeUnit.SECONDS.sleep(3); 
     System.out.println("after-sleep"); 
    } 
} 

我在NetBeans中逐步調試它。我得到了一個奇怪的結果。我在mediaplayer.play()中聽到聲音,但只在方法start()結束時聽到聲音。所有3個片段一次播放。我如何管理他們連續播放?我是否必須多次啓動方法start() - 每個片段都需要一次?還是有另一種方式?

回答

2

MediaPlayer開始異步播放媒體。所以你所有的mediaPlayerN.play()同時發生。

您可以使用Timeline在特定時間開始播放,請參見下文。

另外,由於您只有1個媒體供所有玩家使用,因此您可以對所有樣本使用相同的MediaPlayer。請注意,在這種情況下,您應該使用seek()方法而不是setStartTime()

final MediaPlayer mediaPlayer1 = new MediaPlayer(media); 
Timeline timeline = new Timeline(
    new KeyFrame(Duration.ZERO, "plays at start", new EventHandler<ActionEvent>() { 

     @Override 
     public void handle(ActionEvent t) { 
      mediaPlayer1.setStartTime(Duration.millis(1219.0)); 
      mediaPlayer1.setStopTime(Duration.millis(2728.0)); 
      mediaPlayer1.play(); 
     } 
    }), 
    new KeyFrame(Duration.seconds(5), "plays after 5 seconds", new EventHandler<ActionEvent>() { 

     @Override 
     public void handle(ActionEvent t) { 
      mediaPlayer1.seek(Duration.millis(3947.0)); 
      mediaPlayer1.setStopTime(Duration.millis(6629.0)); 
      mediaPlayer1.play(); 
     } 
    }), 
    new KeyFrame(Duration.seconds(10), "plays after 10 seconds", new EventHandler<ActionEvent>() { 

     @Override 
     public void handle(ActionEvent t) { 
      mediaPlayer1.seek(Duration.millis(7453.0)); 
      mediaPlayer1.setStopTime(Duration.millis(10704.0)); 
      mediaPlayer1.play(); 
     } 
    }) 
); 
timeline.play();