読者です 読者をやめる 読者になる 読者になる

音声ファイルを再生する

Java

Javaで音楽を再生する必要があったのでこのブログを参考にさせていただいた.

nautilus2580.hatenablog.com

変更点はAudioFormatクラスからサンプルレートを取ってきて clip.start() をちゃんと待つようにしたことと,同期再生を追加したこと.

import java.io.File;

import javax.sound.sampled.AudioFormat;
import javax.sound.sampled.AudioSystem;
import javax.sound.sampled.Clip;
import javax.sound.sampled.DataLine;

public class SoundPlayer{
    private AudioFormat format = null;
    private DataLine.Info info = null;
    private Clip clip = null;

    public SoundPlayer(String pathname){
        File file = new File(pathname);

        try{
            format = AudioSystem.getAudioFileFormat(file).getFormat();
            info = new DataLine.Info(Clip.class, format);
            clip = (Clip) AudioSystem.getLine(info);
            clip.open(AudioSystem.getAudioInputStream(file));

        }catch(Exception e){
            e.printStackTrace();
        }
    }
    
    //非同期再生 実行するとすぐ制御が帰ってくる
    public void play(){
        new Thread(){
            public void run(){
                playSync();
            }

        }.start();
    }
    
    //同期再生 再生が終わるまで帰ってこない
    public void playSync(){
        // time : 総サンプル数をサンプルレートで割った音声ファイルの時間[msec] 少数切り捨てされると途中で再生が止まるので Math.ceil で切り上げ
        long time = (long)Math.ceil(1000 * clip.getFrameLength() / format.getSampleRate() );
        clip.start();
        try {
            Thread.sleep(time);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }

    //再生位置を初期位置に戻す
    public void back2StartPos(){
        clip.setFramePosition(0);
    }

    //停止
    public void stop(){
        clip.stop();
    }
}

以下のコードで再生できる

SoundPlayer sp = new SoundPlayer("sound.wav");
sp.playSync();
sp.play();

繰り返し再生するときは

SoundPlayer sp = new SoundPlayer("sound.wav");
while(true){
    sp.playSync();
    sp.stop();
    sp.back2StartPos();
}

でうまくいった.stop() なしだと再生されたり再生されなかったりした.
毎回インスタンスを生成しても連続再生はできた.