[英]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 + "]";
}
}
已经尝试了以下两种帮助,但效果并不理想
JavaFX 8 QuantumRenderer高CPU使用率
可能是因为.pause和.play与倍数mediaPlayer的使用导致了此问题,或者我可能会严重使用它们的概念。
感谢未来的帮助!
我想您应该使用一个单独的线程进行音频播放。 这样一来,您可以在打开新线程之前杀死音频线程,从而使程序的其余部分仅使用所需的线程
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.