0

我正在做一个项目,我将有一个 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中打开单独的线程,它会定期检查一些wheather API,当温度变化时,会根据温度变化添加声音效果,如回声、失真或其他东西(如果它更冷,那么x它会将回声效果放在运行剪辑等)

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

提前感谢您的回答。

4

1 回答 1

0

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

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

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

为了管理声音,我会考虑使用util.Timer(而不是Swing.Timer),并在决定如何处理混音的组成线索之前检查每次迭代的时间和日期(以及天气,如果你有相应的 API)。或者也许使用util.concurrent.ExecutorService. 如果您的 GUI 是 JavaFX,anAnimationTimer也是一个合理的选择。

如果您确实喜欢将声音文件混合到单个输出行,则可以使用TinySoundAudioCue等库轻松完成。使用AudioCue(我写的)你可以混合到一个单一的输出,并为你的“音景”中的每个声音提示保证音量、平移甚至播放速度管理。

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

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

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

于 2020-05-14T17:48:35.763 回答