再生時間の計算

WAVEとMIDIの再生ができるようになり、再生時間を表示したいと思い調べてみた。MIDIの再生では最初から再生時間を返すメソッドが準備されているが、WAVEの再生では再生時間の計算が必要だった。

MidiPlayer.java
import java.io.*;
import javax.sound.midi.*;

class MidiPlayer {
  public static void main(String[] args) {
    MidiPlayer mp = new MidiPlayer(args[0]);
  }
  MidiPlayer(String filename) {
    try {
      Sequencer sqr = MidiSystem.getSequencer();
      sqr.setLoopCount(0);
      sqr.open();
      FileInputStream fis = new FileInputStream(filename);
      Sequence sq = MidiSystem.getSequence(fis);
      fis.close();
      sqr.setSequence(sq);
      double sec = sqr.getMicrosecondLength() / 1000 / 1000;
      System.out.println("再生時間;" + String.format("%.1f", sec) + "秒");

      sqr.start();
      while(sqr.isRunning()) {
        Thread.sleep(1000);
      }
      sqr.stop();
    } catch(Exception e) {
      e.printStackTrace();
    }
    System.exit(0);
  }
}

SequencerのgetMicrosecondLength()を使ってlong型のマイクロ秒を取得し、2回1000で割って秒単位にした。long型は整数なので、割り算の結果が少数になる可能性が高いため、double型に結果を収納。String.format()を使って少数第1位まで表示させた。

SoundPlayer.java
import javax.sound.sampled.*;
import java.io.*;

public class SoundPlayer {
  public static void main(String[] args) {
    SoundPlayer sp = new SoundPlayer(args[0]);
  }
  SoundPlayer(String filename) {
    try {
      File file = new File(filename);
      if(file.exists()) {
        AudioInputStream stream = AudioSystem.getAudioInputStream(file);
        byte[] buf = new byte[stream.available()];
        stream.read(buf, 0, buf.length);
        AudioFormat format = stream.getFormat();
        long nBytesRead = format.getFrameSize()*stream.getFrameLength();
        DataLine.Info info = new DataLine.Info(SourceDataLine.class, format);
        SourceDataLine line = (SourceDataLine)AudioSystem.getLine(info);
        double sec = stream.getFrameLength() / format.getFrameRate();
        System.out.println("再生時間:" + String.format("%.1f", sec) + "秒");

        line.open(format);
        line.start();
        line.write(buf, 0, (int)nBytesRead);
        line.drain();
        line.close();
      } else {
        System.out.println("ファイルが見つかりませんでした。");
      }
    } catch(Exception e) {
      e.printStackTrace();
    }
    System.exit(0);
  }
}

AudioInputStreamのgetFrameLength()でlong型のサンプルフレーム数で表されるストリームの長さを取得。AudioFormatのgetFrameRate()でfloat型の1 秒当たりのフレーム数を取得。これらから秒数を算出し、先ほどと同じく小数第1位までを表示させた。

コメント
コメントする








   
この記事のトラックバックURL
トラックバック

calendar

S M T W T F S
     12
3456789
10111213141516
17181920212223
24252627282930
<< September 2017 >>

selected entries

categories

archives

links

profile

書いた記事数:84 最後に更新した日:2016/09/11

search this site.

others

mobile

qrcode

powered

無料ブログ作成サービス JUGEM