【发布时间】:2023-03-11 09:52:01
【问题描述】:
我正在开发一个 Java 游戏,并希望捆绑并播放一些采样音效。我打算使用标准的 javax.sound.sampled 功能来播放它们。
哪种格式最适合这类样本?我正在寻找在 Java 中以编程方式使用的良好压缩、良好质量和便利性的混合体。
【问题讨论】:
标签: java audio file-format
我正在开发一个 Java 游戏,并希望捆绑并播放一些采样音效。我打算使用标准的 javax.sound.sampled 功能来播放它们。
哪种格式最适合这类样本?我正在寻找在 Java 中以编程方式使用的良好压缩、良好质量和便利性的混合体。
【问题讨论】:
标签: java audio file-format
质量与尺寸
这里有一些关于 MP3 与 WAV 区别的有趣文章。
为什么选择 MP3 和 WAV?这些是我在创建程序时最常看到的,因此兼容性从来都不是问题。
我有一个非常有用的 java 文件,它可以为你做所有事情。你用声音文件的路径构造对象,然后使用方法来播放、停止、循环等等。
与此同时,您可以查看这些以供参考,尽管它们不是那么干净:How can I play sound in Java?。
简单编程
很遗憾,我在这台计算机上没有该文件,但这里有一个简化版本。这不像您希望的那样使用 javax.swing,但老实说,我一直更喜欢替代方法。
因为这和我其他电脑上的文件不一样,所以我不能保证 MP3 的兼容性。
import sun.audio.*;
import java.io.*;
public class Sound {
private InputStream input;
private AudioStream audio;
public Sound (File fileName)
{
input = new FileInputStream();
audio = new AudioStream(input);
}
public void play()
{
AudioPlayer.player.start(audio);
}
public void stop()
{
AudioPlayer.player.stop(audio);
}
}
实例化:
String projectPath = <project directory>; // getting this is another question
Sound helloSound = new Sound(new File(projectPath + "/Sounds"));
现在您可以在想要播放剪辑时拨打helloSound.play();。
我更喜欢这种方法,这样您就不必在每次想要播放剪辑时都将所有内容都设置为流。这应该与一些声音片段和简介有效地工作,但请确保不要过度使用它并占用内存。将其用于常见的音效。
简单编程,续
找到一个播放 MP3 的好文件,就像我上面展示的那样。我完全忘了把我的放在一个单独的线程中,所以这是一个更好的选择。
import java.io.BufferedInputStream;
import java.io.FileInputStream;
import javazoom.jl.player.Player;
public class MP3 {
private String filename;
private Player player;
// constructor that takes the name of an MP3 file
public MP3(String filename) {
this.filename = filename;
}
public void close() { if (player != null) player.close(); }
// play the MP3 file to the sound card
public void play() {
try {
FileInputStream fis = new FileInputStream(filename);
BufferedInputStream bis = new BufferedInputStream(fis);
player = new Player(bis);
}
catch (Exception e) {
System.out.println("Problem playing file " + filename);
System.out.println(e);
}
// run in new thread to play in background
new Thread() {
public void run() {
try { player.play(); }
catch (Exception e) { System.out.println(e); }
}
}.start();
}
// test client
public static void main(String[] args) {
String filename = args[0];
MP3 mp3 = new MP3(filename);
mp3.play();
// do whatever computation you like, while music plays
int N = 4000;
double sum = 0.0;
for (int i = 0; i < N; i++) {
for (int j = 0; j < N; j++) {
sum += Math.sin(i + j);
}
}
System.out.println(sum);
// when the computation is done, stop playing it
mp3.close();
// play from the beginning
mp3 = new MP3(filename);
mp3.play();
}
}
很容易,对吧? ;)。
【讨论】:
Java 支持 mp3,而 mp3 格式让您可以选择在哪里平衡压缩与质量。
有一个纯 java MP3 解码器,http://www.javazoom.net/javalayer/javalayer.html,它插入到 javax.sound 包中。 Sun 还发布了一个mp3 plugin 用于 java 声音。
【讨论】:
我不是这方面的专家,但 Sun 提供的所有教程和示例都适用于 .au 文件。似乎是一个有保证的最低公分母。要获得更大的文件格式灵活性,您需要使用Java Media Framework 之类的东西。
【讨论】: