JAVAFX实现多媒体播放器

使用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);
    }
}

 

 

  • 2
    点赞
  • 32
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值