Как я могу воспроизвести звук на Java?

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

25.08.2008 16:00:04
Взгляните на этот класс: github.com/dberm22/DBoard/blob/master/src/com/dberm22/utils/… Вы можете вызывать его с помощью (новый поток (новый MediaPlayer (PATHTOFILE)). Start ();
dberm22 20.01.2014 14:36:01
9 ОТВЕТОВ

Плохой пример:

import  sun.audio.*;    //import the sun.audio package
import  java.io.*;

//** add this into your application code as appropriate
// Open an input stream  to the audio file.
InputStream in = new FileInputStream(Filename);

// Create an AudioStream object from the input stream.
AudioStream as = new AudioStream(in);         

// Use the static class member "player" from class AudioPlayer to play
// clip.
AudioPlayer.player.start(as);            

// Similarly, to stop the audio.
AudioPlayer.player.stop(as); 
19
27.09.2011 00:22:22
java.sun.com/products/jdk/faq/faq-sun-packages.html Существуют открытые альтернативы API для использования sun.audio.
McDowell 23.04.2009 13:44:06
@GregHurlman Разве пакет sun. * Сделан не для использования нами, разработчиками?
Tom Brito 10.06.2010 14:00:07
Этот пример взят из статьи JavaWorld 1997 года. Вы устарели, вы НЕ должны использовать пакеты sun. *.
sproketboy 17.12.2010 09:39:48
Вам когда-нибудь нужно закрыть "в"?
rogerdpack 23.12.2010 00:20:59
+1 за не использование солнца. * Пакеты. У них есть странные ошибки, такие как отсутствие обработки файлов размером более 1 МБ и невозможность воспроизведения одного клипа, если предыдущий еще не закончен, и т. Д.
rogerdpack 26.09.2011 22:55:53
РЕШЕНИЕ

Я написал следующий код, который отлично работает. Но я думаю, что это работает только с .wavформатом.

public static synchronized void playSound(final String url) {
  new Thread(new Runnable() {
  // The wrapper thread is unnecessary, unless it blocks on the
  // Clip finishing; see comments.
    public void run() {
      try {
        Clip clip = AudioSystem.getClip();
        AudioInputStream inputStream = AudioSystem.getAudioInputStream(
          Main.class.getResourceAsStream("/path/to/sounds/" + url));
        clip.open(inputStream);
        clip.start(); 
      } catch (Exception e) {
        System.err.println(e.getMessage());
      }
    }
  }).start();
}
131
8.06.2016 05:54:48
Чтобы избежать случайного отключения Clip, необходим LineListener. Посмотрите: stackoverflow.com/questions/577724/trouble-playing-wav-in-java/…
yanchenko 23.02.2009 15:40:31
+1 за решение, которое использует публичный API. Не является ли создание нового потока ненужным (избыточным)?
Jataro 29.07.2009 09:09:27
Спасибо .. Это избыточно? Я создал новую тему, чтобы снова воспроизвести звук до окончания первого клипа.
pek 29.07.2009 19:04:36
Я знаю, что clip.start () порождает новый поток, поэтому я почти уверен, что в этом нет необходимости.
Jataro 29.07.2009 20:20:20
1) Threadненужный 2) Хороший пример использования Clipсмотрите в информации о JavaSound. стр . 3) Если метод требует URL(или File) дать ему опасность URL(или File), а не принять то, Stringчто представляет его. (Просто личная «пчела в моем капоте».) 4) e.printStackTrace();предоставляет больше информации с меньшим набором текста, чем System.err.println(e.getMessage());.
Andrew Thompson 18.08.2011 19:01:02

Существует альтернатива импортированию звуковых файлов, которая работает как в апплетах, так и в приложениях: конвертировать аудиофайлы в файлы .java и просто использовать их в своем коде.

Я разработал инструмент, который делает этот процесс намного проще. Это немного упрощает Java Sound API.

http://stephengware.com/projects/soundtoclass/

2
1.08.2016 20:50:01
Я использовал вашу систему для создания класса из файла WAV, однако, когда я делаю my_wave.play (); он не воспроизводит звук .. Есть ли аудиосистема, которую мне нужно инициализировать или что-то в этом роде? ..
Nathan F. 17.03.2013 18:22:45
это было бы действительно здорово, если бы это действительно работало. При запуске play () происходит сбой получения Audio Line (исключение «java.lang.IllegalArgumentException: нет интерфейса для соответствия строк SourceDataLine, поддерживающий формат PCM_UNSIGNED 44100,0 Гц, 16 бит, стерео, 4 байта / кадр, little-endian.» Не поддерживается. выброшен). Грустный.
phil294 16.12.2014 02:29:54

Некоторое время назад я создал игровой фреймворк для работы на Android и настольном компьютере, настольная часть, которая обрабатывает звук, может быть использована как вдохновение для того, что вам нужно.

https://github.com/hamilton-lima/jaga/blob/master/jaga%20desktop/src-desktop/com/athanazio/jaga/desktop/sound/Sound.java

Вот код для справки.

package com.athanazio.jaga.desktop.sound;

import java.io.BufferedInputStream;
import java.io.IOException;
import java.io.InputStream;

import javax.sound.sampled.AudioFormat;
import javax.sound.sampled.AudioInputStream;
import javax.sound.sampled.AudioSystem;
import javax.sound.sampled.DataLine;
import javax.sound.sampled.LineUnavailableException;
import javax.sound.sampled.SourceDataLine;
import javax.sound.sampled.UnsupportedAudioFileException;

public class Sound {

    AudioInputStream in;

    AudioFormat decodedFormat;

    AudioInputStream din;

    AudioFormat baseFormat;

    SourceDataLine line;

    private boolean loop;

    private BufferedInputStream stream;

    // private ByteArrayInputStream stream;

    /**
     * recreate the stream
     * 
     */
    public void reset() {
        try {
            stream.reset();
            in = AudioSystem.getAudioInputStream(stream);
            din = AudioSystem.getAudioInputStream(decodedFormat, in);
            line = getLine(decodedFormat);

        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    public void close() {
        try {
            line.close();
            din.close();
            in.close();
        } catch (IOException e) {
        }
    }

    Sound(String filename, boolean loop) {
        this(filename);
        this.loop = loop;
    }

    Sound(String filename) {
        this.loop = false;
        try {
            InputStream raw = Object.class.getResourceAsStream(filename);
            stream = new BufferedInputStream(raw);

            // ByteArrayOutputStream out = new ByteArrayOutputStream();
            // byte[] buffer = new byte[1024];
            // int read = raw.read(buffer);
            // while( read > 0 ) {
            // out.write(buffer, 0, read);
            // read = raw.read(buffer);
            // }
            // stream = new ByteArrayInputStream(out.toByteArray());

            in = AudioSystem.getAudioInputStream(stream);
            din = null;

            if (in != null) {
                baseFormat = in.getFormat();

                decodedFormat = new AudioFormat(
                        AudioFormat.Encoding.PCM_SIGNED, baseFormat
                                .getSampleRate(), 16, baseFormat.getChannels(),
                        baseFormat.getChannels() * 2, baseFormat
                                .getSampleRate(), false);

                din = AudioSystem.getAudioInputStream(decodedFormat, in);
                line = getLine(decodedFormat);
            }
        } catch (UnsupportedAudioFileException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        } catch (LineUnavailableException e) {
            e.printStackTrace();
        }
    }

    private SourceDataLine getLine(AudioFormat audioFormat)
            throws LineUnavailableException {
        SourceDataLine res = null;
        DataLine.Info info = new DataLine.Info(SourceDataLine.class,
                audioFormat);
        res = (SourceDataLine) AudioSystem.getLine(info);
        res.open(audioFormat);
        return res;
    }

    public void play() {

        try {
            boolean firstTime = true;
            while (firstTime || loop) {

                firstTime = false;
                byte[] data = new byte[4096];

                if (line != null) {

                    line.start();
                    int nBytesRead = 0;

                    while (nBytesRead != -1) {
                        nBytesRead = din.read(data, 0, data.length);
                        if (nBytesRead != -1)
                            line.write(data, 0, nBytesRead);
                    }

                    line.drain();
                    line.stop();
                    line.close();

                    reset();
                }
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

}
3
29.03.2013 01:01:01
Этот код может stream.reset();привести к ошибке Resetting to invalid mark. Что вы предлагаете сделать, чтобы это исправить?
driima 10.01.2020 00:25:42
может быть, воссоздать поток, см. stackoverflow.com/questions/18573767/…
hamilton.lima 10.01.2020 12:45:58
Я на самом деле решил эту проблему, используя raw.mark(raw.available()+1)после инициализации rawи затем в цикле while, а затем используя raw.reset()вместо stream.reset(). Моя проблема сейчас в том, что когда дело доходит до сброса, между играми возникает разрыв. Я хочу добиться непрерывного цикла, как вы получаете с Clip. Я не использую, Clipпотому что манипулирование элементами управления, такими как MASTER_GAIN, имеет заметную задержку ~ 500 мс. Вероятно, это должен быть отдельный вопрос, который я собираюсь задать позже.
driima 10.01.2020 13:47:00

Для воспроизведения звука в Java, вы можете обратиться к следующему коду.

import java.io.*;
import java.net.URL;
import javax.sound.sampled.*;
import javax.swing.*;

// To play sound using Clip, the process need to be alive.
// Hence, we use a Swing application.
public class SoundClipTest extends JFrame {

   public SoundClipTest() {
      this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
      this.setTitle("Test Sound Clip");
      this.setSize(300, 200);
      this.setVisible(true);

      try {
         // Open an audio input stream.
         URL url = this.getClass().getClassLoader().getResource("gameover.wav");
         AudioInputStream audioIn = AudioSystem.getAudioInputStream(url);
         // Get a sound clip resource.
         Clip clip = AudioSystem.getClip();
         // Open audio clip and load samples from the audio input stream.
         clip.open(audioIn);
         clip.start();
      } catch (UnsupportedAudioFileException e) {
         e.printStackTrace();
      } catch (IOException e) {
         e.printStackTrace();
      } catch (LineUnavailableException e) {
         e.printStackTrace();
      }
   }

   public static void main(String[] args) {
      new SoundClipTest();
   }
}
8
29.05.2015 20:04:16

Я не хотел иметь так много строк кода, чтобы играть просто чертовски звучащий звук. Это может работать, если у вас есть пакет JavaFX (уже включен в мой jdk 8).

private static void playSound(String sound){
    // cl is the ClassLoader for the current class, ie. CurrentClass.class.getClassLoader();
    URL file = cl.getResource(sound);
    final Media media = new Media(file.toString());
    final MediaPlayer mediaPlayer = new MediaPlayer(media);
    mediaPlayer.play();
}

Примечание: вам нужно инициализировать JavaFX . Быстрый способ сделать это - вызвать конструктор JFXPanel () один раз в вашем приложении:

static{
    JFXPanel fxPanel = new JFXPanel();
}
10
23.05.2017 11:54:51

По какой-то причине верхний ответ от wchargin давал мне ошибку нулевого указателя, когда я вызывал this.getClass (). GetResourceAsStream ().

То, что работало для меня, было следующим:

void playSound(String soundFile) {
    File f = new File("./" + soundFile);
    audioIn = AudioSystem.getAudioInputStream(f.toURI().toURL());  
    Clip clip = AudioSystem.getClip();
    clip.open(audioIn);
    clip.start();
}

И я бы сыграл звук с:

 playSound("sounds/effects/sheep1.wav");

sounds / Effects / sheep1.wav находился в базовой директории моего проекта в Eclipse (поэтому не в папке src).

6
8.06.2016 04:41:08
Привет, Эндрю, твой код работал на меня, но я заметил, что на выполнение уходит немного больше времени ... около 1,5 сек.
user5033850 11.12.2016 11:32:18
getResourceAsStream()вернется, nullесли ресурс не найден, или выдаст исключение, если nameесть null- не ошибка верхнего ответа, если указанный путь недействителен
user85421-Banned 22.02.2020 08:51:17

Эта ветка довольно старая, но я определил вариант, который может оказаться полезным.

Вместо использования AudioStreamбиблиотеки Java вы можете использовать внешнюю программу, такую ​​как Windows Media Player или VLC, и запускать ее с помощью консоли через Java.

String command = "\"C:/Program Files (x86)/Windows Media Player/wmplayer.exe\" \"C:/song.mp3\"";
try {
    Process p = Runtime.getRuntime().exec(command);
catch (IOException e) {
    e.printStackTrace();
}

Это также создаст отдельный процесс, которым может управлять программа.

p.destroy();

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

Если время не имеет значения, тогда это полезно.

0
10.10.2016 19:38:26
Хотя я думаю, что это объективно плохое решение (с точки зрения надежности, эффективности и других подобных показателей), оно, по крайней мере, интересное, о котором я бы и не подумал!
Max von Hippel 29.11.2019 04:31:35

Я удивлен, что никто не предложил использовать Апплет. Использование Applet . Вы должны будете предоставить звуковой файл звукового сигнала как wavфайл, но он работает. Я попробовал это на Ubuntu:

package javaapplication2;

import java.applet.Applet;
import java.applet.AudioClip;
import java.io.File;
import java.net.MalformedURLException;
import java.net.URL;

public class JavaApplication2 {

    public static void main(String[] args) throws MalformedURLException {
        File file = new File("/path/to/your/sounds/beep3.wav");
        URL url = null;
        if (file.canRead()) {url = file.toURI().toURL();}
        System.out.println(url);
        AudioClip clip = Applet.newAudioClip(url);
        clip.play();
        System.out.println("should've played by now");
    }
}
//beep3.wav was available from: http://www.pacdv.com/sounds/interface_sound_effects/beep-3.wav
2
24.01.2019 07:55:36