我正在开发一个Java游戏,并想捆绑并播放大量采样音效。我打算使用标准的javax.sound.sampled功能来播放它们。基于Java的游戏的声音格式
什么格式最适合这些样本?我正在寻找良好的压缩,体面的质量和方便在Java中编程使用的混合。
我正在开发一个Java游戏,并想捆绑并播放大量采样音效。我打算使用标准的javax.sound.sampled功能来播放它们。基于Java的游戏的声音格式
什么格式最适合这些样本?我正在寻找良好的压缩,体面的质量和方便在Java中编程使用的混合。
质量与尺寸
这里是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也发布了一个用于java声音的mp3 plugin。
还有FLAC和Vorbis编解码器可用的端口,寻找JFlac/Jorbis(这些对CPU要求稍高,但避免MP3许可问题)。 如果部署是一个问题,WAV可能是最无痛的,因为默认情况下,JRE包含在JRE中。 JLayer/JFlac和Jorbis也(大部分)无痛融合(我将它们全部用于音乐播放器)。 – Durandal 2010-07-13 18:19:30
我不是这方面的专家,但所有来自Sun的教程和示例都使用.au
文件。似乎是一个有保证的最低公因分母。为了获得更大的文件格式灵活性,您需要使用类似Java Media Framework的东西。
有一个JMF的mp3插件:http://java.sun.com/javase/technologies/desktop/media/jmf/mp3/download.html – 2010-07-13 13:26:32
谢谢这是一个有用的引导! – mikera 2010-07-14 21:51:55
感谢您的伟大的链接和示例代码! – mikera 2010-07-14 21:51:32
不客气:)。 – 2010-07-14 22:10:21