在部署在 heroku 上的网络应用程序中使用 Java 声音 API

Using the Java Sound API in a web-app deployed on heroku

我们正在开展一个基于众包创作音乐的项目。人们为每个音符投票,直到投票结束,然后继续进行下一次投票,直到音乐的 canvas 被填满。一个类似的项目是 crowdsound,如果你想了解它的外观。

我们已经在 heroku 上托管了 .war 并且我们已经设法使一切正常,除了声音。每次我们尝试调用 Java Sound API(我们使用 midi 合成器)时,我们都会收到以下错误:

2017-03-10T09:49:01.338821+00:00 app[web.1]: javax.sound.midi.MidiUnavailableException: Can not open line
2017-03-10T09:49:01.339228+00:00 app[web.1]:    at com.sun.media.sound.SoftSynthesizer.open(SoftSynthesizer.java:1155)
2017-03-10T09:49:01.339288+00:00 app[web.1]:    at com.sun.media.sound.SoftSynthesizer.open(SoftSynthesizer.java:1066)
2017-03-10T09:49:01.339340+00:00 app[web.1]:    at music.MusicPlayer.run(MusicPlayer.java:99)
2017-03-10T09:49:01.339391+00:00 app[web.1]:    at java.lang.Thread.run(Thread.java:745)
2017-03-10T09:49:01.340759+00:00 app[web.1]: Caused by: java.lang.IllegalArgumentException: No line matching interface SourceDataLine supporting format PCM_SIGNED 44100.0 Hz, 16 bit, stereo, 4 bytes/frame, little-endian is supported.
2017-03-10T09:49:01.340869+00:00 app[web.1]:    at javax.sound.sampled.AudioSystem.getLine(AudioSystem.java:479)
2017-03-10T09:49:01.340924+00:00 app[web.1]:    at javax.sound.sampled.AudioSystem.getSourceDataLine(AudioSystem.java:606)
2017-03-10T09:49:01.340975+00:00 app[web.1]:    at com.sun.media.sound.SoftSynthesizer.open(SoftSynthesizer.java:1095)
2017-03-10T09:49:01.341045+00:00 app[web.1]:    ... 3 more

这是否意味着我们不能在网络应用程序中使用 midi 合成器,或者有什么方法可以让它工作吗?

您根本无法从 Java WAR 播放声音,因为它是在服务器端执行的。此外,heroku 实例可能完全缺少声音硬件。

如果您想生成声音然后提供给 Web 客户端,您需要使用一些生成声音文件的 MIDI 渲染器,然后将生成的音频文件提供给客户端(例如 WAV文件)或简单地将 MIDI 提供给客户端并让浏览器通过库播放 MIDI,例如MIDI.js.