【问题标题】:adding sfx on Clip object in java在 java 中的 Clip 对象上添加 sfx
【发布时间】:2020-08-28 07:59:31
【问题描述】:

我正在做一个项目,我将制作一个 24 小时长的声音片段,该片段具有基于当地白天的不同阶段(早上阶段有一个声音,过渡阶段,晚上阶段等)

所以这是我现在得到的,没关系

播放剪辑的方法(以微秒为单位转动当前本地时间并设置起点以匹配当前时间 - 如果我开始程序 13:35,它将开始播放该位置上的声音的中午阶段,没关系

void playMusic(String musicLocation){
        try{
           File musicPath = new File(musicLocation);

           if(musicPath.exists())
           {               
               Calendar calendar = Calendar.getInstance();
                //Returns current time in millis
                long timeMilli2 = calendar.getTimeInMillis();
                 System.out.println("Time in milliseconds using Calendar: " + (timeMilli2 * 1000)) ;


               AudioInputStream audioInput  = AudioSystem.getAudioInputStream(musicPath);

               Clip clip = AudioSystem.getClip();
               clip.open(audioInput);
               clip.setMicrosecondPosition(12345678);
               clip.start();
               clip.loop(Clip.LOOP_CONTINUOUSLY);

               System.out.println(clip.getMicrosecondLength());

               //setFramePosition
               JOptionPane.showMessageDialog(null, "Press OK to stop playung");

           }
           else
           {
               System.out.println("no file");
           }
        }catch(Exception ex){
            ex.printStackTrace();
        }
    }

只调用这个方法的main方法

    public static void main(String[] args) {
        String filepath = "src/sounds/test_file.wav";

        PyramidMethods pyra = new PyramidMethods();
        pyra.playMusic(filepath);  
    }

现在这非常简单明了,也是我需要的,但现在我想知道的是以下内容 -> 我可以根据外面的温度添加音效吗?如果可以,如何添加?

所以我的想法是在 main 中打开单独的线程,它会定期检查一些天气 API,当温度变化时会根据温度变化添加声音效果,如回声、失真或其他东西(如果它更冷,那么 x 它会发出回声运行剪辑的音效等)

这在 Java 中甚至可能吗?这是我第一次在 Java 中使用声音,所以我什至对这里的搜索词都没有经验,有人会建议其他一些编程语言吗?

提前感谢您的回答。

【问题讨论】:

    标签: java audio soundeffect


    【解决方案1】:

    那一定是一个巨大的文件!

    是的,Java 非常适合创建和管理音景。

    可以同时播放和听到不同的Clips。当您播放它们时,Java 会自动为该播放创建一个Thread,并且大多数操作系统会将所有播放线程混合在一起。曾经有 Linux 系统只允许一个输出。 IDK 如果这仍然是一个限制,或者您甚至针对 Linux 系统。此外,操作系统能够干净地处理的声音播放总数也将存在上限。 (通常情况下,如果你以这种方式过度强调系统,你就会退出。)

    为了管理声音,我会考虑使用util.Timer(而不是Swing.Timer),并在决定做什么之前检查每次迭代的时间和日期(如果你有相应的API,还有天气)与混音的成分提示。或者也许使用util.concurrent.ExecutorService。如果您的 GUI 是 JavaFX,AnimationTimer 也是一个合理的选择。

    如果您更喜欢将声音文件混合到单个输出行,这可以通过使用诸如 TinySoundAudioCue 之类的库轻松完成。使用AudioCue(我写的),您既可以混音到单个输出,又可以保证音量、平移甚至播放速度管理,每个声音提示都是“音景”的一部分。

    这有助于降低运行程序所需的 RAM 总量。正如我在演示中展示的那样,人们可以获取一个提示(例如青蛙的叫声),并以不同的音量、平底锅和速度多次播放它,以创造整个池塘青蛙在叫声的错觉。因此,一个只有一秒长的 .wav 可以用来模拟一个小时长的 .wav。

    我认为,如果您想添加回声或失真等效果,则必须使用库或编写自己的库。 Java 支持Processing Audio with Controls,但这高度依赖于所使用计算机的操作系统。不过,Echo 和 Distortion 编写起来并不难,如果您已将其合并到您的程序中,则可以将其添加到 AudioCue 库代码中。 (回声涉及添加时间延迟,通常使用数组来保存声音数据,直到播放时间,而失真涉及通过变换函数运行 PCM 声音数据,例如Math.tanh 和一个最大值和最小值来保持[-1, 1] 范围内的结果。)

    对于其他可能的库或语言,我相信 Unity (C#) 和 Unreal (C++) 游戏引擎/环境都实现了广泛的音频效果,包括 3D处理。

    【讨论】:

    • 这肯定是一个巨大的文件,非常感谢您的回复,这非常有帮助,因为正如我所说,我刚刚进入这个领域,任何指向正确方向的信息都是有用的,这不仅仅是“任何信息”。再次感谢您的有用评论
    猜你喜欢
    • 2013-10-29
    • 2021-06-20
    • 1970-01-01
    • 2016-02-14
    • 2017-05-26
    • 1970-01-01
    • 1970-01-01
    • 2016-10-24
    • 1970-01-01
    相关资源
    最近更新 更多