2010-07-13 83 views
3

我正在开发一个Java游戏,并想捆绑并播放大量采样音效。我打算使用标准的javax.sound.sampled功能来播放它们。基于Java的游戏的声音格式

什么格式最适合这些样本?我正在寻找良好的压缩,体面的质量和方便在Java中编程使用的混合。

回答

3

质量与尺寸

这里是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(); 

    } 

} 

很简单,对吗? )。

拿罐子here。请参阅文档here

+0

感谢您的伟大的链接和示例代码! – mikera 2010-07-14 21:51:32

+0

不客气:)。 – 2010-07-14 22:10:21

2

Java支持mp3,并且mp3格式可以让您选择平衡压缩与质量的平衡点。

有一个纯java的MP3解码器,http://www.javazoom.net/javalayer/javalayer.html,它插入到javax.sound包中。 Sun也发布了一个用于java声音的mp3 plugin

+0

还有FLAC和Vorbis编解码器可用的端口,寻找JFlac/Jorbis(这些对CPU要求稍高,但避免MP3许可问题)。 如果部署是一个问题,WAV可能是最无痛的,因为默认情况下,JRE包含在JRE中。 JLayer/JFlac和Jorbis也(大部分)无痛融合(我将它们全部用于音乐播放器)。 – Durandal 2010-07-13 18:19:30

2

我不是这方面的专家,但所有来自Sun的教程和示例都使用.au文件。似乎是一个有保证的最低公因分母。为了获得更大的文件格式灵活性,您需要使用类似Java Media Framework的东西。

+0

有一个JMF的mp3插件:http://java.sun.com/javase/technologies/desktop/media/jmf/mp3/download.html – 2010-07-13 13:26:32

+0

谢谢这是一个有用的引导! – mikera 2010-07-14 21:51:55