2012-09-25 4 views
0

Как мы воспроизводим звук (музыкальный файл любого формата, например .wma, .mp3) в приложении для настольных компьютеров Java? (не апплет)Воспроизведение звука в приложении Java Desktop

Я использовал следующий код (взятый из другого вопроса о переполнении стека), но он выбрасывает исключение.

public class playsound { 
    public static void main(String[] args) { 
s s=new s(); 
s.start(); 
    } 
} 
class s extends Thread{ 
    public void run(){ 
     try{ 
      InputStream in = new FileInputStream("C:\\Users\\srgf\\Desktop\\s.wma"); 
     AudioStream as = new AudioStream(in); //line 26 
      AudioPlayer.player.start(as); 
     } 
     catch(Exception e){ 
      e.printStackTrace(); 
      System.exit(1); 
     } 
    } 
} 

Программа при запуске выдает следующее исключение:

java.io.IOException: could not create audio stream from input stream 
    at sun.audio.AudioStream.<init>(AudioStream.java:82) 
    at s.run(delplaysound.java:26) 
+0

Проверьте http://stackoverflow.com/questions/5667454/playing-audio-file-in-java-application?rq=1. Я знаю, что это означает, что mp3 не поддерживается JAVA, но может быть таким же, что и для Windows. – Austin

ответ

0

Используйте эту библиотеку: http://www.javazoom.net/javalayer/javalayer.html

public void play() { 
     String song = "http://www.ntonyx.com/mp3files/Morning_Flower.mp3"; 
     Player mp3player = null; 
     BufferedInputStream in = null; 
     try { 
      in = new BufferedInputStream(new URL(song).openStream()); 
      mp3player = new Player(in); 
      mp3player.play(); 
     } catch (MalformedURLException ex) { 
     } catch (IOException e) { 
     } catch (JavaLayerException e) { 
     } catch (NullPointerException ex) { 
     } 

} 

Надежда, что помогает всем с подобным вопросом :-)

+0

Может ли вышеуказанный код воспроизводить файлы с жесткого диска? Это не работает для меня. Я включил вышеуказанный код в метод run() Thread и после оператора mp3player.play(), я включил инструкцию sleep (10000); так что звук завершает воспроизведение. – Ranjith

+0

Да, см. Этот пример http://thiscouldbebetter.wordpress.com/2011/06/14/playing-an-mp3-from-java-using-jlayer/ –

0

Хммм. Это может выглядеть как реклама для моих вещей, но вы можете использовать свой API здесь:

https://github.com/s4ke/HotSound

воспроизведение довольно легко с этим.

Альтернативные: использование Java-клипы (Пребуферинг)

... code ... 
// specify the sound to play 
File soundFile = new File("pathToYouFile"); 
//this does the conversion stuff for you if you have the correct SPIs installed 
AudioInputStream inputStream = 
getSupportedAudioInputStreamFromInputStream(new FileInputStream(soundFile)); 

// load the sound into memory (a Clip) 
DataLine.Info info = new DataLine.Info(Clip.class, inputStream.getFormat()); 
Clip clip = (Clip) AudioSystem.getLine(info); 
clip.open(sound); 

// due to bug in Java Sound, explicitly exit the VM when 
// the sound has stopped. 
clip.addLineListener(new LineListener() { 
    public void update(LineEvent event) { 
    if (event.getType() == LineEvent.Type.STOP) { 
     event.getLine().close(); 
     System.exit(0); 
    } 
    } 
}); 

// play the sound clip 
clip.start(); 
... code ... 

Тогда вам нужен этот метод:

public static AudioInputStream getSupportedAudioInputStreamFromInputStream(InputStream pInputStream) throws UnsupportedAudioFileException, 
     IOException { 
    AudioInputStream sourceAudioInputStream = AudioSystem 
      .getAudioInputStream(pInputStream); 
    AudioInputStream ret = sourceAudioInputStream; 
    AudioFormat sourceAudioFormat = sourceAudioInputStream.getFormat(); 
    DataLine.Info supportInfo = new DataLine.Info(SourceDataLine.class, 
      sourceAudioFormat, 
      AudioSystem.NOT_SPECIFIED); 
    boolean directSupport = AudioSystem.isLineSupported(supportInfo); 
    if(!directSupport) { 
     float sampleRate = sourceAudioFormat.getSampleRate(); 
     int channels = sourceAudioFormat.getChannels(); 
     AudioFormat newFormat = new AudioFormat(AudioFormat.Encoding.PCM_SIGNED, 
       sampleRate, 
       16, 
       channels, 
       channels * 2, 
       sampleRate, 
       false); 
     AudioInputStream convertedAudioInputStream = AudioSystem 
       .getAudioInputStream(newFormat, sourceAudioInputStream); 
     sourceAudioFormat = newFormat; 
     ret = convertedAudioInputStream; 
    } 
    return ret; 
} 

Источник для примера клип (с небольшими изменениями мной): http://www.java2s.com/Code/Java/Development-Class/AnexampleofloadingandplayingasoundusingaClip.htm

SPI добавляются путем добавления их .jars к пути к классу

для mp3 них:

0

Использование JavaFX (которая поставляется вместе с вашим JDK) довольно просто. Вам понадобятся следующие импорта:

import javafx.scene.media.Media; 
import javafx.scene.media.MediaPlayer; 
import javafx.util.Duration; 

import java.nio.file.Paths; 

Шаги:

Initialize JavaFX:

new JFXPanel(); 

Создать Media (звук):

Media media = new Media(Paths.get(filename).toUri().toString()); 

Создать MediaPlayer для воспроизведения звука:

MediaPlayer player = new MediaPlayer(media); 

И играть Media:

player.play(); 

Вы можете установить время начала/остановки времени, а также с MediaPlayer.setStartTime() и MediaPlayer.setStopTime():

player.setStartTime(new Duration(Duration.ZERO)); // Start at the beginning of the sound file 
player.setStopTime(1000); // Stop one second (1000 milliseconds) into the playback 

Или, вы можете прекратить играть с MediaPlayer.stop().

Функция образец для воспроизведения аудио:

public static void playAudio(String name, double startMillis, double stopMillis) { 
    Media media = new Media(Paths.get(name).toUri().toString()); 
    MediaPlayer player = new MediaPlayer(media); 

    player.setStartTime(new Duration(startMillis)); 
    player.setStopTime(new Duration(stopMillis)); 
    player.play(); 
} 

Более подробную информацию можно найти на JavaFX javadoc.

Смежные вопросы