繁体   English   中英

MediaFX播放的长音频上的JavaFX CPU使用率很高

[英]JavaFX high CPU usage on long audio played by a MediaPlayer

我是JavaFX 8初学者,我已经做了一些正确的应用程序,但是现在我想尽可能地对其进行优化。

我的应用程序的简短说明:它需要很长的音频带(至少半小时),您可以随时切换它们。 切换时,切换的音频在前一个的最后播放时间播放。 我的音频是本地存储的.m4a文件。

我的问题:所有这些都正常运行,但是需要占用大量CPU(据我估计),我得到了i7 4720HQ,当我进行一些音频切换时(甚至当我只启动一个时),它会增长到20,然后是30甚至占使用量的40% 我觉得这太多了,再加上我仅用3种音频进行了测试,并且我的应用最多可以有6种音频。 但是,当我让一部音频播放超过30秒时,它就降为标准用法。

我所做的:简单使用Oracle MediaPlayer的基本用法。 切换系统的工作原理是:暂停按钮单击时未播放的所有音频,并播放与该按钮相关的被单击的音频。

这是我的代码: AudioButtons类,该类将音频链接到在单击时播放的按钮

package application;

import java.util.ArrayList;
import java.util.List;
import javafx.scene.Node;
import javafx.scene.control.Button;
import javafx.scene.control.ButtonBar;
import javafx.util.Duration;

public class AudioButtons {

        List<AudioPlayer> audioPlayer = new ArrayList<AudioPlayer>();
        Duration lastPlayedTime = null;
        Duration launchDelay;
        ButtonBar buttonBar;

        public void computeDelay(long delay) {
            launchDelay = new Duration(delay);
        }

        public AudioButtons(ButtonBar buttonBar) {
            this.buttonBar = buttonBar;
        }

        public void setAudio() {
            for(Node buttonNode : buttonBar.getButtons()) {

                Button button = (Button) buttonNode;
                String buttonName = button.getText();

                AudioPlayer audioPlayerAdding = new AudioPlayer("C:/JFXTest/"+buttonName+".m4a");
                audioPlayerAdding.setMediaId(Integer.parseInt(buttonName));
                audioPlayer.add(audioPlayerAdding);

                button.setOnMousePressed((event) -> {
                    int buttonIndex = Integer.parseInt(buttonName) - 1;
                    for(AudioPlayer oneAudioPlayer : audioPlayer) {
                        System.out.println("Time of media id "+oneAudioPlayer.getMediaId()+" "+oneAudioPlayer.audioPlayer.getCurrentTime());
                        if(oneAudioPlayer.isLaunched()) {
                            lastPlayedTime = oneAudioPlayer.audioPlayer.getCurrentTime();

                            oneAudioPlayer.pauseAudio();
                        }
                    } 

                    if(audioPlayer.get(buttonIndex).isPaused()) {
                        audioPlayer.get(buttonIndex).audioPlayer.seek(lastPlayedTime);
                        audioPlayer.get(buttonIndex).resumeAudio();
                    } else {
                        if(lastPlayedTime==null)
                            lastPlayedTime = launchDelay;
                        audioPlayer.get(buttonIndex).launch(lastPlayedTime);
                    }
                });
            }

        }
}

AudioPlayer类,控制所有音频输入

package application;

import java.io.File;
import javafx.scene.media.Media;
import javafx.scene.media.MediaPlayer;
import javafx.scene.media.MediaView;
import javafx.util.Duration;

public class AudioPlayer {

    MediaView mediaView;
    MediaPlayer audioPlayer;
    int mediaId;
    Duration currentTime = null;
    boolean launched = false;
    boolean paused = false;

    public AudioPlayer(String playerSoundPath) {
        String path = new File(playerSoundPath).toURI().toString();
        Media audioMedia = new Media(path);
        audioPlayer = new MediaPlayer(audioMedia);
        System.out.println("Playing of "+path);
    }

    public void setMediaId(int id) {
        mediaId = id;
    }

    public int getMediaId() {
        return mediaId;
    }

    public void launch() {
        audioPlayer.setAutoPlay(true);
        mediaView = new MediaView(audioPlayer);
        launched = true;
        currentTime = mediaView.getMediaPlayer().getCurrentTime();
    }

    public void launch(Duration startTime) {
        audioPlayer.setStartTime(startTime);
        audioPlayer.setAutoPlay(true);
        mediaView = new MediaView(audioPlayer);
        launched = true;
        currentTime = mediaView.getMediaPlayer().getCurrentTime();
    }

    public MediaView getViewStack() {
        return mediaView;
    }

    public Duration getCurrentTime() {
        return currentTime;
    }

    public boolean isLaunched() {
        return launched;
    }

    public boolean isPaused() {
        return paused;
    }

    public void pauseAudio() {
        mediaView.getMediaPlayer().pause();
        paused = true;
        launched = false;
        currentTime = mediaView.getMediaPlayer().getCurrentTime();
    }

    public void resumeAudio() {
        mediaView.getMediaPlayer().play();
        paused = false;
        launched = true;
        currentTime = mediaView.getMediaPlayer().getCurrentTime();
    }

    public void mute() {
        mediaView.getMediaPlayer().setMute(true);
    }

    public boolean isMute() {
        return mediaView.getMediaPlayer().isMute();
    }

    public void unMute() {
        mediaView.getMediaPlayer().setMute(false);
    }

    @Override
    public String toString() {
        return "ViewStack [mediaId=" + mediaId + ", launched=" + launched + ", paused=" + paused + "]";
    }

}

已经尝试了以下两种帮助,但效果并不理想

CPU使用率JavaFX

JavaFX 8 QuantumRenderer高CPU使用率

可能是因为.pause和.play与倍数mediaPlayer的使用导致了此问题,或者我可能会严重使用它们的概念。

感谢未来的帮助!

我想您应该使用一个单独的线程进行音频播放。 这样一来,您可以在打开新线程之前杀死音频线程,从而使程序的其余部分仅使用所需的线程

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM