- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在尝试使用 JavaFX SDK 2.0.1 在 JavaFX 2.0 应用程序中循环播放背景音频。我决定使用由以下代码创建的 MediaPlayer:
MediaPlayerBuilder
.create().media(BACKGROUND_MEDIA)
.cycleCount(MediaPlayer.INDEFINITE);
这基本上是有效的,但是当新的周期开始时,音频的结束和开始之间有一个微小的(延迟?)间隙。所以这对我来说不是一个可行的选择,因为它没有播放干净的循环。
我决定构建一个新的 MediaPlayer 对象并在每次媒体结束时开始播放。到目前为止效果很好。此外,我使用一个按钮,单击时播放简短的音频剪辑。我发现频繁快速地单击此按钮会导致背景音频中断。我创建了一个示例来重现此行为,方法是在单击按钮一次时无限播放音量为 0 的 AudioClip。该示例不是独立的,因为缺少所需的音频文件。它需要在项目的源目录中放置2个音频文件:
当播放其他一次性音频声音时,如何实现在后台播放干净的音频循环而不会出现这些中断?这只是性能问题吗?
示例:
package mediatest;
import javafx.application.Application;
import javafx.event.ActionEvent;
import javafx.event.EventHandler;
import javafx.scene.Group;
import javafx.scene.Scene;
import javafx.scene.control.Button;
import javafx.scene.media.AudioClip;
import javafx.scene.media.Media;
import javafx.scene.media.MediaPlayer;
import javafx.scene.media.MediaPlayerBuilder;
import javafx.stage.Stage;
public class MediaTest extends Application {
private static final AudioClip CLICK_AUDIOCLIP = new AudioClip(MediaTest.class.getResource("/click.wav").toString());
private static final Media BACKGROUND_MEDIA = new Media(MediaTest.class.getResource("/background.wav").toString());
private MediaPlayerBuilder builder;
public static void main(String[] args) {
Application.launch(args);
}
@Override
public void start(Stage primaryStage) {
Group root = new Group();
Scene scene = new Scene(root, 300, 250);
this.builder = MediaPlayerBuilder
.create()
.media(BACKGROUND_MEDIA)
.onEndOfMedia(new Runnable() {
public void run() {
MediaPlayer player = MediaTest.this.builder.build();
player.play();
}
});
MediaPlayer player = this.builder.build();
player.play();
Button btn = new Button();
btn.setText("Repeat playing short audio clip");
btn.setOnAction(new EventHandler<ActionEvent>() {
public void handle(ActionEvent event) {
//Simulation of many button clicks
MediaTest.CLICK_AUDIOCLIP.setCycleCount(AudioClip.INDEFINITE);
MediaTest.CLICK_AUDIOCLIP.play(0);
}
});
root.getChildren().add(btn);
primaryStage.setScene(scene);
primaryStage.show();
}
}
最佳答案
你看过ExecutorService吗? ?然后您将拥有许多预定义的线程,如下所示:
ExecutorService service = Executors.newFixedThreadPool(4);
其中 4 是它创建的线程数。它将提高性能,因为它使用已经创建的线程,而不是每次要运行某些内容时创建一个新线程。
您将创建一个 Runnable 并使用服务执行它,如下所示:
Runnable r = new Runnable() {
@Override
public void run() {
playSound();
}
};
service.execute(r);
这不仅会提高性能,而且会自动将作业分配给线程池中当前不忙的线程。
另外看看这个:Playing sound loops using javafx我相信这可以解决您的小延迟问题。
编辑:真抱歉,我不知道这篇文章这么旧。这是 Google 的最高结果。
关于javafx-2 - 如何在 JavaFX 2.0 中并行播放干净的音频循环和一次性声音?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8042671/
我是一名优秀的程序员,十分优秀!