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

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

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

}

}

第一种方法:.直接解压下载的插件到和eclipse目录对应的plugins和features目录底下,重启eclipse就可以用了

第二种方法: 解压到任意目录下,然后在eclipse目录下建一个名叫links的文件夹,在里面建一个以.link结尾的文件(用来标示该插件),然后用记事本打开这个文件在里面写上path=你解压的插件的目录(比如说把插件解压到了D:\abc\里面,那么插件的目录应该是这样子的d:\abc\eclipse\plugins和d:\abc\eclipse\features,在写入文件时这样写path=d:\\abc,注意:1.路径里的'\'都要写成'\\',2.写入路径时,写到插件eclipse文件夹的上一层就行了),保存之后,重启eclipse就行了.(推荐用这种方法,卸的时候直接删就行了)

第三种方法:1.help--Install new software..

2.点add,如果是从网上直接安装就填写插件名称(自己定义)和插件网址,如果是本地的压缩包(.zip)或者jar文件,就点Archive..,选择压缩文件,如果是本地文件夹,就点local..,选择文件夹.

3.然后等他显示出插件的详细信息之后,如果不想让他检查更新(通常大的插件很费时间)就把左下角的....update....的那一项的勾去掉,如果需要检查更新的话直接点next>然后如果需要接受协议就点同意,一直下一步到完成,重启eclipse就行了.

有三种方式安装插件:

第一种:解压方式:从网上下载离线的插件压缩包,把压缩包里面的features和plugins两个文件夹里面的内容复制粘贴到eclipse安装目录中对应的features和plugins文件夹中,重启eclipse即可。

第二种:link方式安装:

a>.把插件解压缩到eclipse的安装目录,保持目录结构为:

%eclipse_home%\插件名\eclipse\features

%eclipse_home%\插件名\eclipse\plugins

b>.在eclipse安装目录中新建一个links文件夹,在里面新建一个文件,格式为:插件名.link 。里面的内容为path=值(值的内容为插件解压缩后的实际路径)

c>.重启eclipse即可

第三种:在线安装方式:运行eclipse,点击help--install new software--在work with中输入插件在线更新地址,点击enter,然后选择插件,点击next进行安装,重启eclipse即可。


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/bake/11774329.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-18
下一篇 2023-05-18

发表评论

登录后才能评论

评论列表(0条)

保存