Javaでサウンドを再生する

はじめに



このトピックに関する通常のロシア語の情報はありません。 また、Javaチュートリアルには多くの要望があります。 また、javax.sound.sampledのアーキテクチャは単純ではありますが、決して簡単ではありません。 したがって、私はこのトピックにHabréに関する最初の投稿を捧げることにしました。 続行:



音を鳴らす



ここではすべてが多かれ少なかれ単純です。 javax.sound.sampledをインポートして実行します。

try { File soundFile = new File("snd.wav"); //  // AudioInputStream //    IOException  UnsupportedAudioFileException AudioInputStream ais = AudioSystem.getAudioInputStream(soundFile); //   Clip //  LineUnavailableException Clip clip = AudioSystem.getClip(); //     Clip //  IOException  LineUnavailableException clip.open(ais); clip.setFramePosition(0); //    clip.start(); //!!! //    ,   ,     // GUI-  3    Thread.sleep(clip.getMicrosecondLength()/1000); clip.stop(); // clip.close(); // } catch (IOException | UnsupportedAudioFileException | LineUnavailableException exc) { exc.printStackTrace(); } catch (InterruptedException exc) {}
      
      







音量調節


サウンドで遊んだ後、おそらくプログラムで音量を変更できるようにしたいでしょう。 Java Sound APIは、このような機会に独自の曲がり具合を提供します。

 //   FloatControl vc = (FloatControl) clip.getControl(FloatControl.Type.MASTER_GAIN); //  //      vc.getMinimum()  vc.getMaximum() vc.setValue(5); // 
      
      





このコードは、 clip.open(ais)行clip.setFramePosition(0)行の間に配置する必要があります。



プロセスを簡素化する



そして最後に、あなたが苦しまないように、私は音を演奏するためのクラスを広げました

 import java.io.File; import java.io.IOException; import javax.sound.sampled.AudioInputStream; import javax.sound.sampled.AudioSystem; import javax.sound.sampled.Clip; import javax.sound.sampled.FloatControl; import javax.sound.sampled.LineEvent; import javax.sound.sampled.LineListener; import javax.sound.sampled.LineUnavailableException; import javax.sound.sampled.UnsupportedAudioFileException; public class Sound implements AutoCloseable { private boolean released = false; private AudioInputStream stream = null; private Clip clip = null; private FloatControl volumeControl = null; private boolean playing = false; public Sound(File f) { try { stream = AudioSystem.getAudioInputStream(f); clip = AudioSystem.getClip(); clip.open(stream); clip.addLineListener(new Listener()); volumeControl = (FloatControl) clip.getControl(FloatControl.Type.MASTER_GAIN); released = true; } catch (IOException | UnsupportedAudioFileException | LineUnavailableException exc) { exc.printStackTrace(); released = false; close(); } } // true    , false    public boolean isReleased() { return released; } //       public boolean isPlaying() { return playing; } //  /* breakOld  ,      breakOld==true,            */ public void play(boolean breakOld) { if (released) { if (breakOld) { clip.stop(); clip.setFramePosition(0); clip.start(); playing = true; } else if (!isPlaying()) { clip.setFramePosition(0); clip.start(); playing = true; } } } //   ,   play(true) public void play() { play(true); } //   public void stop() { if (playing) { clip.stop(); } } public void close() { if (clip != null) clip.close(); if (stream != null) try { stream.close(); } catch (IOException exc) { exc.printStackTrace(); } } //   /* x      0  1 (     ) */ public void setVolume(float x) { if (x<0) x = 0; if (x>1) x = 1; float min = volumeControl.getMinimum(); float max = volumeControl.getMaximum(); volumeControl.setValue((max-min)*x+min); } //    (  0  1) public float getVolume() { float v = volumeControl.getValue(); float min = volumeControl.getMinimum(); float max = volumeControl.getMaximum(); return (v-min)/(max-min); } //     public void join() { if (!released) return; synchronized(clip) { try { while (playing) clip.wait(); } catch (InterruptedException exc) {} } } //  ,   public static Sound playSound(String path) { File f = new File(path); Sound snd = new Sound(f); snd.play(); return snd; } private class Listener implements LineListener { public void update(LineEvent ev) { if (ev.getType() == LineEvent.Type.STOP) { playing = false; synchronized(clip) { clip.notify(); } } } } }
      
      







使用は非常に簡単です、例えば:

 Sound.playSound("sounds/hello.wav").join();
      
      







書式



オーディオファイル形式のサポートに関するいくつかの言葉:mp3を忘れ、wavを思い出してください。 Auとaifもサポートされています。



All Articles