如何最小化多个音频代码

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(对于更长的音频文件)。

以上是关于如何最小化多个音频代码的主要内容,如果未能解决你的问题,请参考以下文章

如何在屏幕锁定或最小化浏览器期间禁用移动设备上的网页音频?

最小化 iPad 浏览器 Safari 时仍在播放音频

最小化或锁定时继续播放 Audiograph UWP 输出

VBA Access - 如何从多个字段返回最大值/最小值

科尔多瓦(安卓)。最小化应用程序时禁用音频播放

如何使用音频文件? [关闭]