如何最小化多个音频代码
Posted
技术标签:
【中文标题】如何最小化多个音频代码【英文标题】:How to minimalize multiple Audio Codes 【发布时间】:2021-10-14 01:32:07 【问题描述】:我正在尝试将我的代码最小化以处理多个音频。这看起来很糟糕。我怎样才能将这么多代码最小化为一个清晰易读的代码。
public class Sound
public static int playerSound (char[][] gameBoard)
try (AudioInputStream inStream = Audiosystem.getAudioInputStream(Sound.class.getResourceAsStream("Spieler x.wav")) )
Clip clip = AudioSystem.getClip();
clip.open(inStream);
clip.start();
catch (LineUnavailableException lue)
System.out.println("Spieler x.wav" + lue.getMessage());
lue.printStackTrace();
catch (UnsupportedAudioFileException uafe)
System.out.println("Spieler x.wav" + uafe.getMessage());
uafe.printStackTrace();
catch (IOException ioe)
System.out.println("Spieler x.wav" + ioe.getMessage());
ioe.printStackTrace();
return 0;
public static int computerSound (char[][] gameBoard)
try (AudioInputStream inStream = AudioSystem.getAudioInputStream(Sound.class.getResourceAsStream("Bot.wav")) )
Clip clip = AudioSystem.getClip();
clip.open(inStream);
clip.start();
catch (LineUnavailableException lue)
System.out.println("Bot.wav" + lue.getMessage());
lue.printStackTrace();
catch (UnsupportedAudioFileException uafe)
System.out.println("Bot.wav" + uafe.getMessage());
uafe.printStackTrace();
catch (IOException ioe)
System.out.println("Bot.wav" + ioe.getMessage());
ioe.printStackTrace();
return 0;
【问题讨论】:
【参考方案1】:首先,结合您的例外情况:
try (AudioInputStream inStream = AudioSystem.getAudioInputStream(Sound.class.getResourceAsStream("Spieler x.wav")) )
Clip clip = AudioSystem.getClip();
clip.open(inStream);
clip.start();
catch (LineUnavailableException | UnsupportedAudioFileException | IOException e)
System.out.println("Spieler x.wav " + e);
e.printStackTrace();
其次,将两个方法中相同的代码移到单独的private
方法中:
private static void play(String resourcePath)
try (AudioInputStream inStream = AudioSystem.getAudioInputStream(Sound.class.getResourceAsStream(resourcePath)) )
Clip clip = AudioSystem.getClip();
clip.open(inStream);
clip.start();
catch (LineUnavailableException | UnsupportedAudioFileException | IOException e)
System.out.println(resourcePath + ": " + e);
e.printStackTrace();
public static int playerSound(char[][] gameBoard)
play("Spieler x.wav");
return 0;
public static int computerSound(char[][] gameBoard)
play("Bot.wav");
return 0;
第三,由于您总是返回相同的值(零),因此根本没有返回值:
public static void playerSound(char[][] gameBoard)
play("Spieler x.wav");
public static void computerSound(char[][] gameBoard)
play("Bot.wav");
您永远不会使用gameBoard
,因此可以从方法中删除该参数:
public static void playerSound()
play("Spieler x.wav");
public static void computerSound()
play("Bot.wav");
附带说明一下,您可能不应该在 Clip 完成播放之前自动关闭 AudioInputStream,因为 Clip 可能仍在从中读取:
private static void play(String resourcePath)
try
AudioInputStream inStream = AudioSystem.getAudioInputStream(
Sound.class.getResourceAsStream(resourcePath));
Clip clip = AudioSystem.getClip();
clip.addLineListener(e ->
if (e.getType().equals(LineEvent.Type.STOP))
clip.close();
try
inStream.close();
catch (IOException e)
e.printStackTrace();
);
clip.open(inStream);
clip.start();
catch (LineUnavailableException | UnsupportedAudioFileException | IOException e)
System.out.println(resourcePath + ": " + e);
e.printStackTrace();
【讨论】:
大多数情况下是一个非常有用的答案,但如果一个给定的Clip
被多次播放,每次播放时重复从文件中加载数据是非常浪费的。在冗余打开操作完成之前,Clip
甚至不会开始播放,这可能会增加延迟。您应该创建Clips
实例变量并且只打开一次,或者使用SourceDataLine
来播放而不是Clip
(对于更长的音频文件)。以上是关于如何最小化多个音频代码的主要内容,如果未能解决你的问题,请参考以下文章