Сведения о вопросе

FromRussia

21:06, 1st October, 2020

Теги

java   audio    

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

Просмотров: 461   Ответов: 10

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



  Сведения об ответе

SILA

03:56, 3rd August, 2020

Я написал следующий код, который отлично работает. Но я думаю, что это работает только с форматом .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();
}


  Сведения об ответе

ASSembler

07:35, 28th August, 2020

Звук Trail учебника Java стоит того, чтобы стать отправной точкой.


  Сведения об ответе

pumpa

10:41, 6th August, 2020

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

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); 


  Сведения об ответе

repe

22:44, 13th August, 2020

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


  Сведения об ответе

fo_I_K

16:03, 2nd August, 2020

Для воспроизведения звука в 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();
   }
}


  Сведения об ответе

ITSME

22:51, 25th August, 2020

По какой-то причине главный ответ wchargin давал мне ошибку указателя null, когда я вызывал 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).


  Сведения об ответе

PHPH

05:49, 5th August, 2020

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

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

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


  Сведения об ответе

+-*/

07:34, 8th August, 2020

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

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();
        }
    }

}


  Сведения об ответе

PIRLO

08:45, 12th August, 2020

Я удивлен, что никто не предложил использовать Applet. Используйте Applet . Вам придется предоставить звуковой файл beep в виде файла 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


  Сведения об ответе

прога

14:56, 29th August, 2020

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

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

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

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


Ответить на вопрос

Чтобы ответить на вопрос вам нужно войти в систему или зарегистрироваться