问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501

初学了一段时间Java。想做一个应用程序,程序只需要播放一个本地视频,MP4格式,求教怎么做

发布网友 发布时间:2022-04-23 14:06

我来回答

3个回答

热心网友 时间:2023-10-17 10:24

使用javafx的Media,MediaPlayer,MediaView。代码如下:

import java.io.File;

import javafx.application.Application;
import javafx.beans.binding.Bindings;
import javafx.beans.property.ReadOnlyProperty;
import javafx.beans.value.ObservableValue;
import javafx.event.ActionEvent;
import javafx.geometry.Pos;
import javafx.scene.Scene;
import javafx.scene.control.Button;
import javafx.scene.control.Menu;
import javafx.scene.control.MenuBar;
import javafx.scene.control.MenuItem;
import javafx.scene.control.Slider;
import javafx.scene.image.Image;
import javafx.scene.image.ImageView;
import javafx.scene.layout.BorderPane;
import javafx.scene.layout.HBox;
import javafx.scene.layout.Pane;
import javafx.scene.layout.VBox;
import javafx.scene.media.Media;
import javafx.scene.media.MediaPlayer;
import javafx.scene.media.MediaPlayer.Status;
import javafx.scene.media.MediaView;
import javafx.stage.FileChooser;
import javafx.stage.FileChooser.ExtensionFilter;
import javafx.stage.Stage;
import javafx.util.Duration;

public class App extends Application {

private MediaView mediaView;
private Slider processSlider;

private static final Object AUTO = new Object(), MANUAL = new Object();

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

@Override
public void start(Stage primaryStage) throws Exception {
primaryStage.setTitle("javafx视频播放器");
        
        BorderPane root = new BorderPane();
        // 菜单栏
        initMenu(root);
        // 视频播放控件
        mediaView = initMediaView(root);
        // 视频功能控件
        initMediaControllView(root);
        
        primaryStage.setScene(new Scene(root, 600, 400));
        primaryStage.setOnCloseRequest(event -> System.exit(0));
        primaryStage.show();
}

private MenuBar initMenu(final BorderPane parent) {
        Menu menu = new Menu("菜单");
        MenuItem item = new MenuItem("打开");
        item.setOnAction(event -> {
        FileChooser chooser = new FileChooser();
        chooser.setTitle("选择视频文件");
        chooser.getExtensionFilters().add(new ExtensionFilter("视频文件", "*.mp4", "*.flv"));
        File file = chooser.showOpenDialog(parent.getScene().getWindow());
        if (file != null) {
        MediaPlayer player = mediaView.getMediaPlayer();
        // 关闭当前的player
        if (player != null) {
        player.stop();
        player.dispose();
        }
        processSlider.setValue(0);
        // 创建一个新的player并自动播放
        player = new MediaPlayer(new Media(file.toURI().toString()));
        player.currentTimeProperty().addListener(this::mediaProcessChanged);
        player.setAutoPlay(true);
        mediaView.setMediaPlayer(player);
        }
        });
        menu.getItems().add(item);
        
        item = new MenuItem("退出");
        item.setOnAction(event -> parent.getScene().getWindow().hide());
        menu.getItems().add(item);
        
        MenuBar menuBar = new MenuBar(menu);
        parent.setTop(menuBar);
        return menuBar;
}

private MediaView initMediaView(final BorderPane parent) {
        MediaView view = new MediaView();
        Pane pane = new Pane(view);
        parent.setCenter(pane);
        // 视频宽高可随着窗口变化而自动缩放
        view.fitWidthProperty().bind(Bindings.selectDouble(view.parentProperty(), "width"));
        view.fitHeightProperty().bind(Bindings.selectDouble(view.parentProperty(), "height"));
        view.setPreserveRatio(true);
        
return view;
}

private void initMediaControllView(final BorderPane parent) {
VBox bottom = new VBox(10);
bottom.setAlignment(Pos.CENTER);
parent.setBottom(bottom);

Slider slider = new Slider(0, 100, 0);
slider.valueProperty().addListener(this::processSliderChanged);
//slider.setOnMouseClicked(this::processSliderClicked);
bottom.getChildren().add(slider);
processSlider = slider;

HBox hbox = new HBox(10);
bottom.getChildren().add(hbox);
hbox.setAlignment(Pos.CENTER);
Button btn = new Button(null, new ImageView(loadImage("pause.png")));
btn.setOnAction(this::pauseOrPlay);
hbox.getChildren().add(btn);

btn = new Button(null, new ImageView(loadImage("stop.png")));
btn.setOnAction(this::stopPlay);
hbox.getChildren().add(btn);
}

private static Image loadImage(String resPath) {
return new Image(Thread.currentThread().getContextClassLoader().getResourceAsStream(resPath));
}

private void pauseOrPlay(ActionEvent event) {
MediaPlayer player = mediaView.getMediaPlayer();
if (player == null) {
return;
}
Status status = player.getStatus();
if (status == Status.READY || status == Status.PAUSED) {
player.play();
((Button) event.getTarget()).setGraphic(new ImageView(loadImage("pause.png")));
} else if (status == Status.PLAYING) {
player.pause();
((Button) event.getTarget()).setGraphic(new ImageView(loadImage("play.png")));
}
}

private void stopPlay(ActionEvent event) {
MediaPlayer player = mediaView.getMediaPlayer();
if (player == null) {
return;
}
player.stop();
}

//private void processSliderClicked(MouseEvent event) {
//Slider slider = (Slider) event.getSource();
//if (mediaView.getMediaPlayer() != null) {
//Duration d = mediaView.getMediaPlayer().getTotalDuration().multiply(slider.getValue() / slider.getMax());
//mediaView.getMediaPlayer().seek(d);
//}
//}

private void processSliderChanged(ObservableValue<? extends Number> observable, Number oldValue, Number newValue) {
Slider slider = (Slider) ((ReadOnlyProperty<? extends Number>) observable).getBean();
if (slider.getUserData() == AUTO) { // 进度条是自动改变的,因此不用设置播放器
slider.setUserData(null);
return;
}
if (mediaView.getMediaPlayer() != null) {
slider.setUserData(MANUAL);
Duration d = mediaView.getMediaPlayer().getTotalDuration().multiply(newValue.doubleValue() / slider.getMax());
mediaView.getMediaPlayer().seek(d);
}
}

private void mediaProcessChanged(ObservableValue<? extends Duration> observable, Duration oldValue, Duration newValue) {
if (processSlider.getUserData() == MANUAL) { // 手动点击进度条
processSlider.setUserData(null);
return;
}
MediaPlayer player = (MediaPlayer) ((ReadOnlyProperty<? extends Duration>) observable).getBean();
processSlider.setUserData(AUTO);
processSlider.setValue(newValue.toMillis() / player.getTotalDuration().toMillis() * 100);
}

}

热心网友 时间:2023-10-17 10:24

JAVA 对 视频的支持,太有限了。。。。。。。没法直接播放。

~

~

~

~

~

热心网友 时间:2023-10-17 10:25

把文件流,跟多媒体的那些资料先看熟再说。。求你妹的代码。。给你也看不懂。。估计追问哦,多谢指点!

声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
打印机硒鼓安装方法及步骤 如何安装新硒鼓? 我现在很困惑该不该和女友继续发展下去 电脑上字体怎么安装方法简单易行的字体安装步骤及技巧 网页字体显示不出.怎么办? 如何添加电脑上没有的字体解决电脑字体限制增加字体选择多样性_百度知 ... 不有效字体文件 电脑字体识别不了 梦见身上煤炭黑的长辈给我钥匙的预兆 株洲最值得一去的古镇 java播放视频除了用jmf还有什么方法可以实现 java网络怎么实现在线视频播放 java如何设置本地播放器播放指定文件夹视频并循环播放? JAVA中怎么样实现播放视频?? java怎样实现打开视频文件 怎么用java/web代码播放本地视频 Javase怎么实现拖入视频自动播放视频 大家好,想问一下他群发通讯录是不是指通讯录里面的好友,通讯录里面没有的但是有通话记录会不会群发? 苹果手机可以群发短信吗?发短信给自己通讯录全部好友怎么发 个人手机通讯录及设备信息被盗,请问对方可以对我的所有好友群发隐私吗... 微信里如何一次性把消息直接发送给通讯录里的所有好友的步骤?_百度... 什么软件能剪切WAV文件 推荐一个好用的剪辑WAV格式音乐的软件? 求wav音频剪辑软件 请问剪辑WAV文件的软件哪个好? 长治市2021国庆外出需报备吗? 国庆节即将到来,出游期间如何注意自身安全? 大学请假,求个靠谱的理由,国庆节前两天请假 国庆外出旅游要注意哪些事项? 十一放假大学生能不能离校出行? 怎么使用java在网页上播放视频 java:求一段代码,很简单,运行后直接播放一个小视频,播放完后(或者自行定时)立刻自动关闭。 javaweb怎么实现在线视频播放 用java做音视频播放器 java web在播放视频时无法显示画面,但是能够听见声音。 用java如何做一个视频播放器 java实现在浏览器里面播放视频文件 大神们给点提示啊 谢谢 要怎样才能养活小金鱼 求JAVA视频播放器代码 怎么养活金鱼 我想在线预览视频,java后台的response如何设置才能直接播放而非下载呢 怎样把金鱼养活? 谁知道如何用纯JAVA代码播放视频文件(可以播放一种视频文件,如mp4,就可以了) 怎样能养活金鱼? 怎么养金鱼?? 金鱼如何养活 网红刷14万分是多少钱 怎样养活金鱼哇、急 金鱼该怎么养 13万抖币是多少钱