【问题标题】:Sound format for a Java-based game基于 Java 的游戏的声音格式
【发布时间】:2023-03-11 09:52:01
【问题描述】:

我正在开发一个 Java 游戏,并希望捆绑并播放一些采样音效。我打算使用标准的 javax.sound.sampled 功能来播放它们。

哪种格式最适合这类样本?我正在寻找在 Java 中以编程方式使用的良好压缩、良好质量和便利性的混合体。

【问题讨论】:

    标签: java audio file-format


    【解决方案1】:

    质量与尺寸

    这里有一些关于 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

    【讨论】:

      【解决方案2】:

      Java 支持 mp3,而 mp3 格式让您可以选择在哪里平衡压缩与质量。

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

      【讨论】:

      • 还有可用的 FLAC 和 Vorbis 编解码器的端口,寻找 JFlac/Jorbis(这些对 CPU 要求稍高,但避免 MP3 许可证问题)。如果部署是一个问题,WAV 可能是最轻松的,因为默认情况下 JRE 中包含支持。 JLayer/JFlac 和 Jorbis 也(大部分)易于集成(我将它们全部用于音乐播放器)。
      【解决方案3】:

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

      【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-01-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-06-25
      • 2010-09-19
      • 1970-01-01
      • 2011-02-19
      相关资源
      最近更新 更多