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

java audio

304126 просмотра

10 ответа

9665 Репутация автора

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

Автор: pek Источник Размещён: 25.08.2008 04:00

Ответы (10)


19 плюса

15996 Репутация автора

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

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); 
Автор: Greg Hurlman Размещён: 25.08.2008 04:01

125 плюса

9665 Репутация автора

Решение

Я написал следующий код, который отлично работает. Но я думаю, что это работает только с .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();
}
Автор: pek Размещён: 25.08.2008 04:03

25 плюса

43570 Репутация автора

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

Автор: yanchenko Размещён: 22.02.2009 03:32

3 плюса

71 Репутация автора

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

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

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

Автор: Stephen Ware Размещён: 18.01.2010 06:34

3 плюса

1448 Репутация автора

Некоторое время назад я создал игровой фреймворк для работы на 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();
        }
    }

}
Автор: hamilton.lima Размещён: 29.03.2013 01:01

7 плюса

136 Репутация автора

Для воспроизведения звука в 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();
   }
}
Автор: Ishwor Размещён: 11.12.2013 08:24

9 плюса

5898 Репутация автора

Я не хотел иметь так много строк кода, чтобы играть просто чертовски звучащий звук. Это может работать, если у вас есть пакет 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();
}
Автор: Cyril Duchon-Doris Размещён: 02.02.2016 07:24

4 плюса

141 Репутация автора

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

Автор: Andrew Jenkins Размещён: 08.06.2016 04:41

-1 плюса

287 Репутация автора

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

Вместо использования 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();

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

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

Автор: Galen Nare Размещён: 10.10.2016 07:38

2 плюса

10074 Репутация автора

Я удивлен, что никто не предложил использовать Апплет. Используйте 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
Автор: Nav Размещён: 24.01.2019 07:55
Вопросы из категории :
32x32