我是一名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 + "]";
}
}
已经尝试了以下两个没有给出更好结果的帮助
JavaFX 8 QuantumRenderer high CPU usage
也许它是使用.pause&amp; .play与多个mediaPlayer导致这种情况,或者我可能会严重使用他们的概念。
对未来的帮助有帮助!
答案 0 :(得分:0)
我认为您可以使用单独的线程进行音频播放。这样你就可以在打开一个新的音频线程之前杀死它,让你的程序的其余部分只使用它需要的东西