Как добавить музыку (формат .wav) при использовании JPanel / JFrame [duplicate]

Класс SimpleNamespace может использоваться для создания новых атрибутов с помощью setattr или подкласса SimpleNamespace и создания вашей собственной функции для добавления новых имен атрибутов (переменных).

from types import SimpleNamespace

variables = {"b":"B","c":"C"}
a = SimpleNamespace(**v)
setattr(a,"g","G")
a.g = "G+"
something = a.a
155
задан pek 25 August 2008 в 17:00
поделиться

9 ответов

Я написал следующий код, который отлично работает. Но я думаю, что он работает только с форматом .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();
}
116
ответ дан Bilesh Ganguly 22 August 2018 в 19:43
поделиться
  • 1
    Чтобы избежать закрытия клипа в произвольное время, требуется LineListener. Посмотрите: stackoverflow.com/questions/577724/trouble-playing-wav-in-java/… – yanchenko 23 February 2009 в 16:40
  • 2
    +1 для решения, использующего общедоступный API. Разве не создается новый поток ненужным (избыточным)? – Jataro 29 July 2009 в 10:09
  • 3
    Thanx .. Это избыточно? Я превратил его в новый поток, чтобы воспроизвести звук еще до того, как закончится первый клип. – pek 29 July 2009 в 20:04
  • 4
    Я знаю, что clip.start () создает новый поток, поэтому я уверен, что это не нужно. – Jataro 29 July 2009 в 21:20
  • 5
    1) Thread не требуется. 2) Для хорошего примера использования Clip см. Информацию JavaSound. страница . 3) Если для метода требуется URL (или File) дать ему dang URL (или File), а не принять String, который представляет один. (Только персональная «пчела в моей шляпе».) 4) e.printStackTrace(); предоставляет больше информации с меньшим набором текста, чем System.err.println(e.getMessage());. – Andrew Thompson 18 August 2011 в 20:01

По какой-то причине главный ответ 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 (поэтому не внутри src папки).

4
ответ дан Andrew Jenkins 22 August 2018 в 19:43
поделиться
  • 1
    Привет Аню, ваш код работал на меня, но я заметил, что занимает немного дополнительного времени в исполнении ... около 1,5 секунд. – user 11 December 2016 в 12:32

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

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

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

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

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

-1
ответ дан Galen Nare 22 August 2018 в 19:43
поделиться

Неверный пример:

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); 
20
ответ дан Greg Hurlman 22 August 2018 в 19:43
поделиться
  • 1
    java.sun.com/products/jdk/faq/faq-sun-packages.html Существуют общедоступные API-интерфейсы для использования sun.audio. – McDowell 23 April 2009 в 14:44
  • 2
    @GregHurlman Не солнце. * Пакет, который не используется нами разработчиками? – Tom Brito 10 June 2010 в 15:00
  • 3
    Этот пример приведен в статье JavaWorld 1997 года. Увы, вы не должны использовать солнце. * Пакеты. – sproketboy 17 December 2010 в 10:39
  • 4
    вам когда-либо нужно закрывать & quot; & quot ;? – rogerdpack 23 December 2010 в 01:20
  • 5
    +1 для not , используя солнце. * Пакеты. У них есть странные ошибки, такие как обработка файлов & gt; 1 МБ и не может воспроизводить один клип, если предыдущий еще не закончен, и т. Д. – rogerdpack 26 September 2011 в 23:55

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

}
3
ответ дан hamilton.lima 22 August 2018 в 19:43
поделиться

Звуковая дорожка учебника Java стоит быть отправной точкой.

22
ответ дан Max 22 August 2018 в 19:43
поделиться
  • 1
    См. Также информацию о JavaSound . страницу , например код и множество удобных ссылок, связанных с JavaSound. – Andrew Thompson 18 August 2011 в 20:06

Для воспроизведения звука в 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();
   }
}
7
ответ дан saman 22 August 2018 в 19:43
поделиться

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

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

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

4
ответ дан Vogel612 22 August 2018 в 19:43
поделиться
  • 1
    Я использовал вашу систему для создания класса из wav-файла, однако, когда я делаю my_wave.play (); он не воспроизводит аудио. Есть ли аудиосистема, которую мне нужно инициализировать или что-то еще? .. – Nathan Fiscaletti 17 March 2013 в 20:22
  • 2
    это было бы действительно здорово, если бы оно действительно работало. При запуске play () происходит сбой в получении Audio Line (исключение & quot; java.lang.IllegalArgumentException: не поддерживается интерфейс соответствия строк SourceDataLine, поддерживающий формат PCM_UNSIGNED 44100.0 Гц, 16 бит, стерео, 4 байта / фрейма, little-endian. & Quot; не бросается). Грустный. – Blauhirn 16 December 2014 в 03:29
Другие вопросы по тегам:

Похожие вопросы: