Как я могу играть звук в Java?

голоса
154

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

Задан 25/08/2008 в 17:00
источник пользователем
На других языках...                            


9 ответов

голоса
117

Я написал следующий код , который работает отлично. Но я думаю , что это работает только с .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();
}
Ответил 25/08/2008 в 17:03
источник пользователем

голоса
21

Sound Trail на Java Tutorial стоит быть отправной точкой.

Ответил 22/02/2009 в 16:32
источник пользователем

голоса
19

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

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); 
Ответил 25/08/2008 в 17:01
источник пользователем

голоса
8

Я не хочу иметь так много строк кода просто играть простой проклятый звук. Это может работать, если у вас есть пакет 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();
}
Ответил 02/02/2016 в 19:24
источник пользователем

голоса
7

Для воспроизведения звука в 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();
   }
}
Ответил 11/12/2013 в 09:24
источник пользователем

голоса
4

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

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

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

Ответил 18/01/2010 в 07:34
источник пользователем

голоса
3

По какой-то причине, верхний ответ на 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");

звуки / эффекты / sheep1.wav находился в базовом каталоге моего проекта в Eclipse (так не внутри папки ЦСИ).

Ответил 08/06/2016 в 04:41
источник пользователем

голоса
2

Я создал основу игры некоторого времени назад, чтобы работать на 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();
        }
    }

}
Ответил 29/03/2013 в 02:01
источник пользователем

голоса
-1

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

Вместо того , чтобы использовать Java AudioStreamбиблиотеку можно использовать внешнюю программу , как , 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();

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

Если время не в сущности, то это полезно.

Ответил 10/10/2016 в 19:38
источник пользователем

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more