当前位置: 首页 > 知识库问答 >
问题:

JavaFX媒体播放器烧毁资源

韦宏朗
2023-03-14

我目前在一个项目中使用Javafx 2,我可能需要长时间无限循环播放一个视频。在windows上,当视频播放时,我的proifiler工具显示非常正常的图片,cpu负载不是很重(在2个内核上运行时约为2x40-50%),内存使用峰值约为250 MB,这是正常的。但是,当我在Ubuntu机器上部署应用程序时,每个内核的cpu负载达到70%左右(尽管它是一个双核atom处理器,所以假设这是正常的),内存使用量不断增加,最终在1.5-2小时内杀死JVM和设备本身。我真的需要一个解决方案,或者至少是这个问题的变通办法,因为它现在是一个阻碍。

我目前正在考虑破解无限循环,并为每个循环创建一个新的Media/MediaPlayer对象,但我不确定它是否会解决这个问题。

你能给我一些关于这个问题的见解吗?

我初始化媒体视图的代码:

final Media m = new Media(new File(new ClientParameters().getProperty("video.path", String.class)).toURI()
                .toString());
        final MediaPlayer player = new MediaPlayer(m);
        player.setMute(true);
        player.setCycleCount(MediaPlayer.INDEFINITE);
        player.setOnError(new Runnable() {
            @Override
            public void run() {
                log.warn("Video error", player.getError());
                Main.loadAcceptablePrompt(Main.getCurrentLocaleResources().getString("Video_Hiba"),
                        FxmlView.START_SCREEN, Main.DEFAULT_LOCALE, ScreenSaverVideoController.this);
            }
        });

        m.setOnError(new Runnable() {
            @Override
            public void run() {
                showLoader();
                Main.getScheduler().submit(new Runnable() {
                    @Override
                    public void run() {
                        log.warn("Video error", player.getError());
                        Main.loadAcceptablePrompt(Main.getCurrentLocaleResources().getString("Video_Hiba"),
                                FxmlView.START_SCREEN, Main.getCurrentLocale(), ScreenSaverVideoController.this);
                    }
                });
            }
        });
        video.setMediaPlayer(player);
        video.getMediaPlayer().play();

Main.getScheduler()返回这个Scheduler对象:

private static final ScheduledExecutorService scheduledExecutor = Executors.newScheduledThreadPool(1);

Main.loadAcceptablePrompt首先调用以下函数,然后加载新的fxml视图:

if (timeoutFuture == null || timeoutFuture.isCancelled() || timeoutFuture.isDone()) return false;
        return timeoutFuture.cancel(true);

这是一个超类的函数,在这种情况下timeoutFuture为null。无论如何,在这个场景中不会调用这个函数。

编辑:在我的Windows机器上,峰值内存使用率似乎也在缓慢上升,但远没有达到Ubuntu机器上的速度。现在我让它在晚上运行,之后我会更新情况。

编辑2:在Windows上运行应用程序一晚后,它仍然运行,没有任何问题。

每次视频结束时,我都尝试重新加载媒体播放器页面,但没有任何变化,内存仍然在 2 小时内用完。

我创建了一个新的jar,只在起始页上有一个MediaView,里面没有其他内容,打包了jfxrt。我在Windows机器上使用的jar文件,它仍然泄漏。

机器上使用的JRE是oracle-java7-安装程序包安装的那个。我尝试过使用OpenJDK,但运行应用程序失败。

用于播放视频的库是由libavformat53包安装的。没有它,在尝试播放视频时出现异常。据我所知,这个包是由VLC使用的,没有错误,所以我很恼火。

共有1个答案

闻人修明
2023-03-14

当我最后一次在台式电脑上安装Linux(Ubuntu或Debian)时,大概是3或4年前,我在任何需要显卡的东西上都遇到了类似的问题。原因是对于图形应用程序,Linux发行版只能快速工作

 类似资料:
  • 这可能不是一个可以接受的问题,但我现在非常绝望。 我需要一个同步java媒体播放器与快速寻找和平衡修改。 脚本: 我有一个javaFX项目,我必须在循环中播放一个非常短(50-100毫秒)的媒体文件。问题是,在重新启动之前,我需要等待一些要求。 简而言之:播放声音- javafx提供了一个我修改过的媒体播放器。 如果有人能为我指出正确的方向(图书馆/我错过的东西),我将不胜感激 ps允许的java

  • 我正在开发一个包含一些音频播放器的RecyclerView的应用程序。应用程序将下载。3gp文件(如果尚未下载)。 当我单击playAudio按钮时,音频未被播放。 这是我的适配器代码: 我怎样才能解决这个问题?

  • 1.1.1. 多媒体播放 1.1.1. 多媒体播放 我们事实上对上游芯片厂商自带的播放器方式做了调整。 Amlogic 芯片 BaseCode 我们禁用了芯片厂商的原生代码的 libplayer 包,原因是芯片厂商的播放器是直接使用 ALSA 框架来调用音频播放功能的。 这对我们 RokidOS 平台让多个进程使用音频设备造成阻碍。基于这个因素,我们使用了 RokidOS 开发的媒体播放库 lib

  • 当我使用MediaPlayer播放mp3文件时,系统会报告错误日志:。但是RealPlayer是正常的。 我发现它的错误只发生在更高的ROM版本。像4.0版本一样,它有错误。在2.3版中,它没有这个错误。 代码: 日志猫错误:

  • 媒体播放器类很好。然而,我无法播放存储在另一个类中的mp3文件(当鼠标单击时)。有人能检查我的密码吗? 这是我尝试用来播放音频文件的类: 当我运行程序时(在下面勾选的鼠标上),我得到了以下两个错误:错误1:线程“AWT-EventQueue-0”java.lang中的异常。不支持的操作异常:尚未实现错误2:线程“thread-3”java.llang中的例外。IllegalStateExcepti

  • 我已经成功地能够从我的服务器流MP3,现在我想显示一个媒体播放器通知与控制时,歌曲开始播放。我已经遵循了一些教程如何做到这一点,但我仍然得到错误时,试图在我的应用程序中做同样的事情。 这是我尝试在音乐开始播放时显示通知的方式 这是完整的 但是,当我运行代码并单击播放按钮时,应用程序崩溃,logcat返回此错误,但没有指向特定的代码行。