Oli*_*erg 3 java javafx video-processing
我需要获取图像作为用户加载的视频的预览,它不需要是一个很棒的缩略图,因为它只是用于聊天应用程序,所以我想到当用户发送包含 mp4 的消息时我处理它并保存一个随机帧。
我用谷歌搜索了一下,每个人都在使用 ffmpeg,但这是一个外部软件,你只能用 java 与它交互,我的项目需要独立,我不希望它依赖于服务器安装了 ffmpeg 的事实,所以我回到过去并找到了 JavaFX,但所有在线片段都没有指定他们正在使用的版本,而且 chatGPT 一如既往地毫无用处,你们能告诉我如何做到这一点,或者至少向我解释一下它是如何工作的吗?我可以自己编码吗?我正在使用这个依赖项
<dependency>
<groupId>org.openjfx</groupId>
<artifactId>javafx-controls</artifactId>
<version>16</version> <!-- the version chatGPT wrote but you can change that -->
</dependency>
Run Code Online (Sandbox Code Playgroud)
如果您有完全不同的解决方案,那也很棒,我只关心在指定路径上使用指定名称保存视频中的随机帧,提前致谢
我尝试了这种方法,但它给出了很多错误,可能是因为版本不匹配
private byte[] getFrameFromVideo(String videoFilePath, int targetTimeSeconds) throws IOException {
try {
Media media = new Media(new File(videoFilePath).toURI().toString());
MediaPlayer mediaPlayer = new MediaPlayer(media);
CountDownLatch latch = new CountDownLatch(1);
mediaPlayer.setOnReady(() -> {
mediaPlayer.pause();
mediaPlayer.setStartTime(mediaPlayer.getTotalDuration().multiply(targetTimeSeconds * 1.0 / media.getDuration().toSeconds()));
mediaPlayer.setStopTime(mediaPlayer.getStartTime().add(mediaPlayer.getTotalDuration().multiply(1.0 / media.getDuration().toSeconds())));
latch.countDown();
});
mediaPlayer.setOnEndOfMedia(() -> {
BufferedImage bufferedImage = new BufferedImage(mediaPlayer.getMedia().getWidth(), mediaPlayer.getMedia().getHeight(), BufferedImage.TYPE_3BYTE_BGR);
FXImage fxImage = mediaPlayer.snapshot(null);
fxImage.pixelReaderProperty().get().getPixels(0, 0, (int) fxImage.getWidth(), (int) fxImage.getHeight(), javafx.scene.image.PixelFormat.getByteRgbInstance(), bufferedImage.getRaster().getDataBuffer());
try {
ByteArrayOutputStream baos = new ByteArrayOutputStream();
ImageIO.write(bufferedImage, "png", baos);
mediaPlayer.dispose();
latch.countDown();
return baos.toByteArray();
} catch (IOException e) {
e.printStackTrace();
}
});
mediaPlayer.play();
latch.await();
} catch (Exception e) {
e.printStackTrace();
}
return null;
}
Run Code Online (Sandbox Code Playgroud)
当您使用 Maven 时,要使用 JavaFX Media,您需要 JavaFX Media 作为 Maven 依赖项,并将其添加到您的 Java 模块系统中。
\n\n您需要启动JavaFX运行时才能正确使用媒体系统。
\n对媒体的 JavaFX API 调用应在 JavaFX 应用程序线程上进行。JavaFX 应用程序线程永远不应该休眠或锁定。
\n要播放媒体并确保它已准备好在选定位置拍摄快照:
\nMediaView节点放在scene.mute媒体播放器。seekAPI 的\n视频中的某个位置。status媒体播放器的\n。play来自所寻找点的视频。状态切换到播放状态后,使用Platform.runLater, 给系统时间渲染所需的帧。并在runLater通话中执行以下步骤:
snapshot的MediaViewa 。stop.MediaPlayerdispose玩家的。您的快照为您提供了一个 JavaFX,image您可以直接在 JavaFX 中显示ImageView。
如果您需要将快照图像保存到磁盘:
\nImage为BufferedImage\ javafx-swingn。\njavafx-media.jpg或png使用ImageIOapi。\n如果您的应用程序是模块化的,则在您的模块信息中包含使其工作所需的所有模块依赖项:
\njavafx.mediajavafx.swingjava.desktop推荐分布
\n为了向最终用户提供您的应用程序功能,建议:
\nmaven-javafx-plugin创建应用的jlinked zip ,\njlink。或者
\njpackage如果您的应用不是模块化的,请使用系统为您的应用创建安装程序。\njpackage打包非模块化应用程序并为各种平台创建安装程序比为模块化应用程序创建 jlink zip 发行版更复杂。对于上述任一方法,用户通常无需在目标计算机上安装任何其他软件即可使用您的应用程序。
\n参考
\n备择方案
\n| 归档时间: |
|
| 查看次数: |
183 次 |
| 最近记录: |