【发布时间】:2016-04-01 09:34:24
【问题描述】:
我是一名 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 和 .play 与多个 mediaPlayer 一起使用导致了这种情况,或者我可能会错误地使用他们的概念。
感谢未来的帮助!
【问题讨论】:
标签: java javafx media-player javafx-8 cpu-usage