Запуск и остановка звуков в Java - PullRequest
2 голосов
/ 15 июля 2011

Как и в этом вопросе , я хотел бы воспроизвести файл WAV в приложении Java, однако мне также хотелось бы иметь возможность приостановить, возобновить и перезапустить звук. Я предполагаю, что могу перезапустить, сделав паузу, а затем просто создав новый звук, но как мне сделать паузу и возобновить в первую очередь?

Обратите внимание, что мой звук ~ 15 минут и 152,8 Мб. Если есть способ сделать это с файлом MP3 (той же длины, 20,8 Мб), это было бы еще лучше.

Ответы [ 2 ]

2 голосов
/ 15 июля 2011

Для воспроизведения файлов WAV см. Ответы на этот вопрос:
Проблема с Javas Audio Clips при частом воспроизведении звуковых сигналов

Для воспроизведения MP3 вы можете использовать JLayer , который представляет собой довольно маленькую банку (думаю, может быть, меньше 100 КБ), которую вы можете связать со своим приложением.

Вот довольно приличный пример того, как его использовать:
MP3.java (из Как воспроизвести файл MP3 на 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();

    }

}
1 голос
/ 15 июля 2011

Как и в этом вопросе, я хотел бы воспроизвести файл WAV в приложении Java, однако мне бы также хотелось иметь возможность приостанавливать, возобновлять и перезапускать звук.Я предполагаю, что могу перезапустить, сделав паузу, а затем просто создав новый звук, но как мне сделать паузу и возобновить в первую очередь?

Для этого идеально подойдет javax.sound.sampled.Clip, за исключением за тот факт, что большинство реализаций Clip не будут загружать более 2 секунд стереозвука, 16 бит, 44,1 кГц!По этой причине я разработал BigClip .BigClip может обрабатывать звуки размером с доступную память.

Обратите внимание, что мой звук составляет ~ 15 минут и 152,8 Мб.Если есть способ сделать это с файлом MP3 (той же длины, 20,8 Мб), это было бы еще лучше.

Конечно.Как упоминалось на информационной странице тега JavaSound ..

Поддержка декодирования MP3

Java Sound API не поддерживает многие форматы сэмплированного звука.В версии 1.6.0_24 Oracle JRE getAudioFileTypes () обычно возвращает {WAVE, AU, AIFF}.MP3-декодер, по крайней мере, находится рядом.Mp3plugin.jar Java Media Framework поддерживает декодирование MP3.

В настоящее время я использую BigClip & jar mp3plugin.jar в проигрывателе DukeBox.Имея 1024Meg памяти, он может легко загружать как 17:12 1812 Overture , так и 15:38 Bolero (два самых длинных трека в моем списке воспроизведения фаворитов).Я упоминаю «оба», поскольку он будет загружать следующий трек во время воспроизведения текущего.


В качестве отступления, остерегайтесь взглянуть на код, в котором упоминаются пакеты sun.audio (упомянутые в обоих связанных потоках),Этот пакет и / или его классы могут быть перемещены или удалены в следующем выпуске (по усмотрению Oracle) и не нужны с Java 1.3.

...