JavaFX媒体应用开发指南
立即解锁
发布时间: 2025-08-18 02:24:39 阅读量: 2 订阅数: 13 

### JavaFX 媒体应用开发指南
#### 1. JavaFX 视频播放器基础
JavaFX 可用于创建功能丰富的视频播放器,其开发思路与之前的示例有相似之处,会复用一些应用特性,如文件拖放、媒体按钮控制等。为了让开发者更聚焦于媒体 API,部分 UI 代码被封装到了便捷函数中。
在开始开发前,需要了解媒体格式。截至目前,JavaFX 2.0 仅支持一种跨平台视频格式 VP6,文件扩展名为 .flv(Adobe Flash Video 格式)。创建 VP6 和 .flv 文件的编码器和解码器由 On2 公司授权。2009 年,On2 被 Google 收购以开发 VP7 和 VP8 推动 HTML5 发展。由于 JavaFX 目标是跨平台,使用网络上流行的编解码器看似合理,但将视频编码为 VP6 .flv 格式需要获取许可证。目前,JavaFX 只能播放 VP6 编码的视频文件。合法将视频编码为 VP6 的编码器只有 Adobe 和 Wildform(http://www.wildform.com)的商业转换器。
若没有编码软件获取 .flv 文件,可从 Media College(http://www.mediacollege.com)获取。具体操作步骤如下:
1. 访问 URL:http://www.mediacollege.com/adobe/flash/video/tutorial/example-flv.html。
2. 找到标题为 “Windy 50s Mobility Scooter Race” 的链接,该链接指向 .flv 媒体文件(20051210 - w50s.flv)。
3. 右键点击链接,选择 “Save target as” 或 “Save link as” 下载文件到本地文件系统。
4. 将文件拖入媒体播放器应用程序即可开始演示。
JavaFX 基本视频播放器具有与音频播放器类似的基本媒体控制功能,如停止、暂停和播放,还新增了搜索和全屏模式等功能。播放视频时,需要一个视图区域(javafx.scene.media.MediaView)来显示视频,同时会创建一个滑块控件来监控视频进度,该滑块位于应用程序左下角。滑块控件允许用户在视频暂停时前后搜索视频。此外,双击应用程序窗口可使视频全屏显示,再次双击或按 Escape 键可恢复窗口。
以下是实现相关功能的代码:
```java
// Full screen toggle
scene.setOnMouseClicked(new EventHandler<MouseEvent>() {
public void handle(MouseEvent event){
if (event.getClickCount() == 2) {
primaryStage.setFullScreen(!primaryStage.isFullScreen());
}
}
});
// update slider as video is progressing (later removal)
progressListener = new ChangeListener<Duration>() {
public void changed(ObservableValue<? extends Duration> observable, Duration oldValue, Duration newValue) {
progressSlider.setValue(newValue.toSeconds());
}
};
slider.valueProperty().addListener(new ChangeListener<Number>() {
public void changed(ObservableValue<? extends Number> observable, Number oldValue, Number newValue) {
if (paused) {
long dur = newValue.intValue() * 1000;
mediaPlayer.seek(new Duration(dur));
}
}
});
// stop previous media player and clean up
if (mediaPlayer != null) {
mediaPlayer.stop();
mediaPlayer.currentTimeProperty().removeListener(progressListener);
mediaPlayer.setOnPaused(null);
mediaPlayer.setOnPlaying(null);
mediaPlayer.setOnReady(null);
}
// play video when ready status
mediaPlayer.setOnReady(new Runnable() {
@Override
public void run() {
progressSlider.setValue(1);
progressSlider.setMax(mediaPlayer.getMedia().getDuration().toMillis()/1000);
mediaPlayer.play();
}
});
// Lazy init media viewer
if (mediaView == null) {
mediaView = MediaViewBuilder.create()
.mediaPlayer(mediaPlayer)
.x(4)
.y(4)
.preserveRatio(true)
.opacity(.85)
.build();
mediaView.fitWidthProperty().bind(scene.widthProperty().subtract(220));
mediaView.fitHeightProperty().bind(scene.heightProperty().subtract(30));
// make media view as the second node on the scene.
root.getChildren().add(1, mediaView);
}
// sometimes loading errors occur
mediaView.setOnError(new EventHandler<MediaErrorEvent>() {
public void handle(MediaErrorEvent event) {
event.getMediaError().printStackTrace();
}
});
mediaView.setMediaPlayer(mediaPlayer);
// pause media and swap button with play button
pauseButton.setOnMousePressed(new EventHandler<MouseEvent>() {
public void handle(MouseEvent me) {
if (mediaPlayer!=null) {
buttonArea.getChildren().removeAll(pauseButton, playButton);
buttonArea.getChildren().add(playButton);
mediaPlayer.pause();
paused = true;
}
}
});
```
0
0
复制全文
相关推荐










