2012年9月30日日曜日

JavaでMP3を再生


一時停止や音量調節などまだまだ実装していないが、とりあえず再生と停止だけできる。

今回はJLayerを利用させてもらった。
http://www.javazoom.net/javalayer/sources.html

プログラムを作るうえで参考にさせてもらったサイト様は
http://labs.unoh.net/2007/11/javamp3.html

修正しました
http://akis-i.blogspot.jp/2013/02/javamp320130226.html

import java.io.BufferedInputStream;
import java.io.FileInputStream;
import java.io.IOException;

import javazoom.jl.decoder.JavaLayerException;
import javazoom.jl.player.Player;

public class AKIMPer extends Thread {
 // variable
 private Player player;
 private BufferedInputStream stream;
 private Boolean is_run;

 // constructor
 public AKIMPer() {
  setStopper();
 }
 public AKIMPer(String file) {
  setStopper();
  setFile(file);
 }

 // methods
 public void start() {
  is_run = true;
  super.start();
 }

 public void stopMusic() {
  try {
   if (player != null) {
    player.close();
   }
   if (stream != null) {
    stream.close();
   }
  } catch (IOException e) {
   System.out.println("IOException");
  } finally {
   setStopper();
  }
 }
 public void run() {
  if (stream == null || player == null || !is_run) {
   stopMusic();
  } else
   try {
    player.play();
   } catch (JavaLayerException e) {
    System.out.println("JavaLayerException");
   } finally {
    System.out.println("End");
   }
 }
 // setter & getter
 public void setFile(String file) {
  try {
   stream = new BufferedInputStream((new FileInputStream(file)));
   player = new Player(stream);
  } catch (IOException e) {
   // System.out.println("BUFFER ERR");
   System.out.println("IOException");
  } catch (JavaLayerException e) {
   // System.out.println("PLAYER ERR");
   System.out.println("JavaLayerException");
  }
 }

 public void setStopper() {
  player = null;
  stream = null;
  is_run = false;
 }

 public boolean getIs_run(){
  return is_run;
 }
}
使い方
コンストラクタにmp3のpathを入れる
start()で音楽を再生するこの時、音楽は別のメソッドで動いているので
例えば、画像のスライドショーとかも作れる。
stopMusic()で音楽再生を止める。

参考ソース
import java.util.Scanner;
public class Test {

 public static void main(String[] args) {
  AKIMPer akimper= new AKIMPer("mp3/test.mp3");
  Scanner in = new Scanner(System.in);
  int temp = 0;
  akimper.start();
  while(akimper.getIs_run()){
   System.out.print("(closing -> 1 ) >_");
   temp = in.nextInt();
   if(temp==1)
    akimper.stopMusic();
  }
 }

}

問題点:
ループさせたりするなどの2回目の再生行為でエラーが起きる。
対策方法はもう一度インスタンスを作るなどである。

0 件のコメント:

コメントを投稿