使用JAVAFX做的视频播放器,实现了视频播放器的基本功能,音量调节,播放进度控制,播放速率调节,播放暂停,视频切换等功能,下面是代码实现。
public class VedioPlayer extends Application{
private ListView<String> listview = new ListView<>();
private DirectoryChooser fileChooser = new DirectoryChooser();
private Slider play_slider= new Slider();
private Slider audio_slider =new Slider(0,100,10);
private VBox bPane=new VBox(5);
private MediaPlayer mPlayer=new MediaPlayer(new Media("file:///D:/桌面/录屏目录/SpringCloud教程/OpenFegin.mp4"));
private MediaView mView=new MediaView(mPlayer);
private BorderPane border=new BorderPane(mView);
private ContextMenu contextMenu = new ContextMenu();
private ObservableList<MenuItem> list = contextMenu.getItems();
private Map<String,String> path = new HashMap<>();
private Alert alert = new Alert(AlertType.INFORMATION);
private Button pBut=new Button(">");
//private HBox VPane=new HBox(0,mView);
private Label time=new Label();
private List<Double> doubles = DoubleStream
.iterate(1.0,x->x+0.2)
.limit(10)
.map(x->Double.valueOf(String.format("%.2f",x)))
.boxed()
.collect(Collectors.toList());
private ComboBox<Double> comboBox = new ComboBox<>(FXCollections.observableList(doubles));
private boolean isplay = true;
private double all_time = 0;
private String vedio_name = "Fegin0.mp4";
@Override
public void init() throws Exception {
comboBox.setValue(1.0);
play_slider.setMin(0);
play_slider.setMax(500);
play_slider.setPrefWidth(500);
play_slider.setMaxWidth(500);
play_slider.setValue(0);
mView.setFitWidth(1254);
contextMenu.setPrefWidth(400);
EventHandler<ActionEvent> value = (x)->{
MenuItem menuItem = (MenuItem)x.getSource();
switch (menuItem.getText()) {
case "查看视频信息":
alert.setTitle("系统提示");
alert.setHeaderText("视频信息");
alert.setContentText(String.format("视频名称 : %s%n视频时长 : %s%n视频播放速率 : %s%n",vedio_name,formattime(all_time,all_time,2),mPlayer.getRate()+""));
alert.show();
break;
case "播放":
mPlayer.play();
pBut.setText("||");
menuItem.setText("暂停");
break;
case "暂停":
mPlayer.pause();
pBut.setText(">");
menuItem.setText("播放");
break;
case "停止":
mPlayer.stop();
break;
case "快进":
mPlayer.seek(Duration.seconds(mPlayer.getCurrentTime().toSeconds()+20));
break;
}
};
Stream.of("查看视频信息","播放","停止","快进")
.map(x->new MenuItem(x))
.forEach(x->{x.setOnAction(value);list.add(x);});
mView.setOnContextMenuRequested(new EventHandler<ContextMenuEvent>() {
@Override
public void handle(ContextMenuEvent event) {
contextMenu.show(mView, event.getScreenX(),event.getScreenY());
}
});
comboBox.valueProperty().addListener(new ChangeListener<Double>() {
@Override
public void changed(ObservableValue<? extends Double> observable, Double oldValue, Double newValue) {
mPlayer.setRate(newValue);
}
});
}
public void setfiles(String paths){
try {
path = Files.list(Paths.get(paths))
.filter(x->!Files.isDirectory(x) && x.getFileName().toString().matches("(.*?)\\.(mp4|avi|flv)"))
.collect(toMap(x->{
String filename = x.getFileName().toString();
return filename.substring(0,filename.lastIndexOf("."));
},x->x.toUri().toString(),(x,y)->x));
listview.setItems(FXCollections.observableArrayList(path.keySet()));
} catch (IOException e) {
e.printStackTrace();
}
}
@Override
public void start(Stage primaryStage) throws Exception {
// fileChooser.getExtensionFilters().addAll(
// new ExtensionFilter("VEDIO","*.mp4"),
// new ExtensionFilter("RMVB","*.rmvb"),
// new ExtensionFilter("AVI","*.avi"),
// new ExtensionFilter("FLV","*.flv")
// );
fileChooser.setInitialDirectory(new File("E:\\迅雷下载"));
double current = mPlayer.getCurrentTime().toSeconds();
double stop = mPlayer.getStopTime().toSeconds();
time.setText(formattime(current,stop,0));
EventHandler<ActionEvent> actionEvent = (e)->
{
ObservableList<Node> list = border.getChildren();
if(list.contains(listview)){
list.remove(listview);
}else{
border.setLeft(listview);
}
};
Button pBut2=new Button("打开目录");
Button pBut3=new Button("播放列表");
pBut3.setOnAction(actionEvent);
pBut.setOnAction(e->
{
if(pBut.getText().equals(">"))
{
mPlayer.play();
pBut.setText("||");
list.get(1).setText("暂停");
}
else
{
mPlayer.pause();
pBut.setText(">");
list.get(1).setText("播放");
}
});
Button rBut=new Button("<<");
rBut.setOnAction(e->mPlayer.seek(Duration.ZERO));
ChangeListener<Duration> changeListener = (x,y,z)->{
if(isplay){
double currents = mPlayer.getCurrentTime().toSeconds();
all_time = mPlayer.getStopTime().toSeconds();
play_slider.setValue(currents/all_time*500);
time.setText(formattime(currents,all_time,0));
}
};
mPlayer.currentTimeProperty().addListener(changeListener);
// listview.selectionModelProperty().addListener(new ChangeListener<MultipleSelectionModel<String>>() {
// @Override
// public void changed(ObservableValue<? extends MultipleSelectionModel<String>> observable,
// MultipleSelectionModel<String> oldValue, MultipleSelectionModel<String> newValue) {
// System.out.println(observable+" : "+oldValue+" : "+newValue);
// }
// });
listview.setOnMouseClicked(new EventHandler<MouseEvent>() {
@Override
public void handle(MouseEvent event) {
@SuppressWarnings("unchecked")
String text = ((ListView<String>)event.getSource()).getSelectionModel().getSelectedItem();
vedio_name = text;
String paths = path.get(text);
if(paths==null)return;
mPlayer.stop();
mPlayer.dispose();
mPlayer = new MediaPlayer(new Media(paths));
mPlayer.currentTimeProperty().removeListener(changeListener);
mPlayer.volumeProperty().bind(audio_slider.valueProperty().divide(100));
mPlayer.currentTimeProperty().addListener(changeListener);
mView.setMediaPlayer(mPlayer);
pBut.setText(">");
}
});
play_slider.setOnMousePressed(x->{
isplay = false;
});
play_slider.setOnMouseReleased(x->{
mPlayer.seek(Duration.seconds(play_slider.getValue()/500*all_time));
isplay = true;
});
mPlayer.volumeProperty().bind(audio_slider.valueProperty().divide(100));
mView.fitWidthProperty().bind(Bindings.divide(primaryStage.widthProperty(),1.0));
mView.fitHeightProperty().bind(Bindings.divide(primaryStage.heightProperty(),1.0));
Label vol=new Label("音量");
time.setStyle("-fx-text-fill:white");
vol.setStyle("-fx-text-fill:white");
HBox hB=new HBox(10,pBut3,pBut2,play_slider,time,pBut,rBut,comboBox,vol,audio_slider);
hB.setStyle("-fx-background-color:#888;-fx-font-size:16px;");
hB.setPrefHeight(80);
hB.setAlignment(Pos.CENTER);
bPane.getChildren().addAll(border,hB);
pBut2.setOnAction(e->{
File files = fileChooser.showDialog(primaryStage);
if(files==null)return;
setfiles(files.getPath());
});
// bPane.setCenter(mView);
// bPane.setLeft(listview);
// bPane.setBottom(hB);
Scene scene=new Scene(bPane,1254,780);
primaryStage.setTitle("视频播放器");
primaryStage.setScene(scene);
primaryStage.show();
}
public static String formattime(double this_time,double all_time,int type){
String thistime = String.format("%02d:%02d:%02d",(int)this_time/3600,(int)this_time%3600/60,(int)this_time%60);
String alltime = String.format("%02d:%02d:%02d",(int)all_time/3600,(int)all_time%3600/60,(int)all_time%60);
return type==1?thistime:type==2?alltime:thistime+"/"+alltime;
}
public static void main(String[] args) {
launch(args);
}
}