gpt4 book ai didi

绘制函数中的 Java 音频

转载 作者:行者123 更新时间:2023-11-29 05:34:06 25 4
gpt4 key购买 nike

在 Java 应用程序中,如何在绘图函数中输出音频?我试过这段代码:

public static void Player(String audioname){ //For audio
InputStream in = null;
try{
in = new FileInputStream (new File (audioname));
}
catch (FileNotFoundException e){
System.err.print("Audio file not found!");
}
try{
as = new AudioStream (in);
}
catch (IOException e){
System.err.print("AudioStream couldn't be created!");
}
}
////////////////////////////////////////////////////////////////
try{
Player(name);
AudioPlayer.player.start(as);
} catch(Exception f){
System.err.print("Audio couldn't be played!");
}

...但是玩家会陷入 Exception f catch 语句。我也试过将它放在不同的地方(作为绘画调用的单独方法,但它仍然不起作用。有什么帮助吗?

编辑:

class playAudio implements Runnable{
public void run(){
try{
Player("countdown.wav");
AudioPlayer.player.start(as);
} catch(Exception f){
System.err.print("Audio couldn't be played!");
}
}
}
///////////////////////////////////////
public void paint(Graphics g){ //Draw function
Graphics2D g2d = (Graphics2D) g;
///////////////////////////////////
Thread audioThrd = new Thread(new playAudio());
audioThrd.start();
}

在这里,我添加了一个线程来播放音频文件,但是“无法播放音频!”仍然显示。我在这里做错了什么?

最佳答案

不,永远不要在绘画内部制作音频。画法只为画画而作,要快到瞎眼。您的绘制方法越慢,您的程序对用户的响应就越慢。运行音频会创建一个长时间运行的进程,如果这发生在绘画方法中,您的程序的 GUI 将逐渐停止,这不是您希望发生的事情。

相反,您希望在 Swing 事件线程之外的后台线程中播放音频。 SwingWorker 可以很好地工作,但任何旧的普通线程也可以。


编辑
关于这段代码:

public void paint(Graphics g){ //Draw function
Graphics2D g2d = (Graphics2D) g;
///////////////////////////////////
Thread audioThrd = new Thread(new playAudio());
audioThrd.start();
}

再次强调,不要这样做。请理解,您无法控制何时甚至 if* 绘制被调用,因为这是由 JVM 控制的。您可以建议通过调用 repaint() 来调用它,但这不能保证有效,尤其是在重绘请求“堆叠”时。另请注意,JVM 可以在您不请求时调用绘制,例如当操作系统通知它其中一个窗口“脏”并需要重新绘制时。

所以底线是:

不要尝试从 PAINT 或 PAINTCOMPONENT 中播放音乐

至于为什么你的代码没有播放音乐,你实现了我的 printStackTrace() 推荐了吗?


接下来我们将讨论为什么您不应该在 paint(Graphics g) 内部进行绘图,而应该在 JComponent 的 paintComponent(Graphics g) 内部进行绘图> 方法。

关于绘制函数中的 Java 音频,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20111638/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com