【问题标题】:Start and stop sounds in JavaJava 中的启动和停止声音
【发布时间】:2011-07-14 23:45:52
【问题描述】:

类似于this question,我想在 Java 应用程序中播放 WAV 文件 - 但是,我还希望能够暂停、恢复和重新启动声音。我猜我可以通过暂停然后创建一个新声音来重新启动,但是我首先要如何暂停和恢复呢?

请注意,我的声音约为 15 分钟和 152.8mb。如果有办法使用 MP3 文件(相同长度,20.8mb)来做到这一点,那就更好了。

【问题讨论】:

    标签: java audio javasound


    【解决方案1】:

    要播放WAV文件,请看这个问题的答案:
    Problem with Javas Audio Clips on frequent playback of beep sounds

    对于播放 MP3,您可以使用 JLayer,这是一个相当小的 jar(我认为是 100k,可能更小),您可以将其与您的应用程序捆绑在一起。

    这是一个相当不错的使用示例:
    MP3.java(来自How to play an MP3 file in Java

    /*************************************************************************
     *  Compilation:  javac -classpath .:jl1.0.jar MP3.java         (OS X)
     *                javac -classpath .;jl1.0.jar MP3.java         (Windows)
     *  Execution:    java -classpath .:jl1.0.jar MP3 filename.mp3  (OS X / Linux)
     *                java -classpath .;jl1.0.jar MP3 filename.mp3  (Windows)
     *  
     *  Plays an MP3 file using the JLayer MP3 library.
     *
     *  Reference:  http://www.javazoom.net/javalayer/sources.html
     *
     *
     *  To execute, get the file jl1.0.jar from the website above or from
     *
     *      http://www.cs.princeton.edu/introcs/24inout/jl1.0.jar
     *
     *  and put it in your working directory with this file MP3.java.
     *
     *************************************************************************/
    
    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();
    
        }
    
    }
    

    【讨论】:

      【解决方案2】:

      与这个问题类似,我想在 Java 应用程序中播放 WAV 文件 - 但是,我还希望能够暂停、恢复和重新启动声音。我猜我可以通过暂停然后创建一个新声音来重新启动,但是我首先要如何暂停和恢复呢?

      javax.sound.sampled.Clip 是理想的选择,除了Clip 的大多数实现不会加载超过 2 秒的立体声、16 位、44.1KHz 声音!出于这个原因,我开发了BigClipBigClip 可以处理与可用内存一样大的声音。

      请注意,我的声音约为 15 分钟和 152.8mb。如果有办法使用 MP3 文件(相同长度,20.8mb)来做到这一点,那就更好了。

      当然。如JavaSound tag info page..中所述。

      MP3 解码支持

      Java Sound API 在内部不支持多种格式的采样声音。在 1.6.0_24 Oracle JRE getAudioFileTypes() 通常会返回 {WAVE, AU, AIFF}。至少一个 MP3 解码器就在附近。 Java Media Framework 的 mp3plugin.jar 支持解码 MP3。

      我目前在 DukeBox 播放器中使用BigClip 和 mp3plugin.jar Jar。给定 1024Meg 的内存,它可以轻松加载 1812 Overture 的 17:12 和 Bolero 的 15:38(我最喜欢的播放列表中最长的两首曲目) .我提到“两者”,因为它会在播放当前曲目时加载下一首曲目。


      顺便说一句,请注意查看提及sun.audio 包的代码(在两个链接线程中都提到)。此包和/或其类可能会在下一版本中移动或删除(由 Oracle 自行决定),并且自 Java 1.3 起不再需要。

      【讨论】:

        猜你喜欢
        • 2011-08-21
        • 1970-01-01
        • 2015-07-20
        • 1970-01-01
        • 1970-01-01
        • 2012-11-07
        • 1970-01-01
        • 2011-06-23
        • 1970-01-01
        相关资源
        最近更新 更多