【JAVA】音声や音楽ファイルを再生するためのクラス
JAVAで音声や音楽の入ったファイルを再生するClassをJavaFXを使って作成しました。
大昔に
Java
楽天 +JMFで同様のものを作りましたが、JavaFX楽天 の時代になってJMFも廃れているので書き直すことにしたのです。
下の動画はクリックすると音が出ます。
簡単なコード
基本的には3行で音声ファイルを再生できる。
Mediaオブジェクトに音楽ファイルを読み込ませ、MediaPlayerに入れる。play()メソッドで再生開始。
Media media = new Media(new File("D:/work/日課時計/はちじです.mp3").toURI().toString());
MediaPlayer mplayer = new MediaPlayer( media );
mplayer.play();
下のサンプルプログラムは、ステージを開いて、ボタンを押すと音声ファイルを再生するもの。
package tomojavalib.swingfx;
import java.io.File;
import javafx.application.Application;
import javafx.scene.Scene;
import javafx.scene.control.Button;
import javafx.scene.input.MouseEvent;
import javafx.scene.layout.*;
import javafx.scene.media.Media;
import javafx.scene.media.MediaPlayer;
import javafx.stage.Stage;
public class SoundFX extends Application {
public static void main(String[] args) {
Application.launch(args);
}
@Override
public void start(Stage stage) throws Exception {
stage.setTitle("JavaFX");
BorderPane pane = new BorderPane();
Scene scene = new Scene(pane, 320, 240);
Button b = new Button("音声再生");
b.addEventHandler( MouseEvent.MOUSE_CLICKED , e -> buttonCliked( e ) );
pane.setCenter(b);
stage.setScene(scene);
stage.show();
}
private void buttonCliked( MouseEvent e ){
Media media = new Media(new File("D:/work/日課時計/はちじです.mp3").toURI().toString());
MediaPlayer mplayer = new MediaPlayer( media );
mplayer.play();
}
}
再生できるファイルフォーマット
JavaFXで再生できるファイルフォーマットはMP3、AAC、WAV。
MP3、WAVは実際に再生できるのを確認しました。
WMAはダメ。
音楽ファイルの再生と情報取得
MediaPlayerの各メソッドで再生したり、情報を得たりすることが出来る。
再生開始、一時停止、停止
mplayer.play();
mplayer.pause();
mplayer.stop();
停止時間(秒)、再生中の経過時間
mplayer.getStopTime().toSeconds()
mplayer.getCurrentTime().toSeconds()
ボリューム調整
setVolume( 1.0 );
音楽再生サンプルプログラム
ページトップの動画のサンプルプログラムです。
再生ボタン楽天 を押すと音声が再生され、ラベルに再生時間、スライダーに再生の進捗状態が表示されます
package tomojavalib.swingfx;
import java.io.File;
import javafx.application.Application;
import javafx.beans.Observable;
import javafx.scene.Scene;
import javafx.scene.control.Button;
import javafx.scene.control.Label;
import javafx.scene.control.Slider;
import javafx.scene.input.MouseEvent;
import javafx.scene.layout.*;
import javafx.scene.media.Media;
import javafx.scene.media.MediaPlayer;
import javafx.stage.Stage;
public class SoundFX2 extends Application {
MediaPlayer mplayer = null;
Slider slider = null;
Label l = null;
public static void main(String[] args) {
Application.launch(args);
}
@Override
public void start(Stage stage) throws Exception {
stage.setTitle("JavaFX");
VBox pane = new VBox();
Scene scene = new Scene(pane, 320, 240);
//ボタンの設定
Button b = new Button("音声再生");
b.addEventHandler( MouseEvent.MOUSE_CLICKED , e -> buttonCliked( e ) );
l = new Label("");
//スライダーの初期化
slider = new Slider();
pane.getChildren().add( b );
pane.getChildren().add( slider );
pane.getChildren().add( l );
stage.setScene(scene);
stage.show();
}
private void buttonCliked( MouseEvent e ){
Media media = new Media(new File("D:/work/日課時計/はちじです.mp3").toURI().toString());
mplayer = new MediaPlayer( media );
mplayer.play();
//スライダーの最大最小を設定
mplayer.setOnReady(() -> {
slider.setMin(mplayer.getStartTime().toSeconds());
slider.setMax(mplayer.getStopTime().toSeconds());
//音声の長さを表示
l.setText( "再生時間 " + mplayer.getStopTime().toSeconds() + " 秒" );
});
//再生時間が進んだらスライダーの位置を変更する
mplayer.currentTimeProperty().addListener((Observable observable) -> slider.setValue( mplayer.getCurrentTime().toSeconds() ));
}
}
Java、JMFを使った音楽再生プログラム
以下は以前作ったJMFを使用した方法です。消そうと思いましたが、まだ時々検索してこられる方がいるので、しばらく残しておきます。
JMFのインストール
JAVA
楽天 だけインストールしても動きません。JMFを追加でインストールしましょう。
JMFはJava Media Frameworkの略です。これをインストールすれば、音声ファイルだけでなく、動画や、USBカメラの制御もjavaで
できるようになります。
具体的なインストールの仕方は...忘れてしまいました。確か、「\jre\lib\ext」フォルダの下にjmf.jar
ファイルを置けばよかったかと思います(間違ってたらごめんなさい)。
音声ファイルの準備
音声は自分の声を録音しても良いのですが、自分の声を聞くのはちょっと恥ずかしいので、フリーの音声合成ソフトを探しました。
見つけたのは、こちら東芝のサイトです。
文章を入力すると音声を合成してくれて、wav形式のファイルをダウンロードできます。
音楽ファイルのファイル形式変換
音楽ファイルですが、wma形式でもっているのですが、Javaが認識してくれませんでした。そこでファイル形式変換のフリーソフトを
利用しました。
ecodecotool
wma→wav形式に変換したら、普通に再生できました。
クラスの使い方
他のクラスから、下記のように呼び出せばOK
PlayMusic pm = new PlayMusic();
String tmps = "c:\\mousugunerujikan.wav";
pm.play( tmps );
再生中にプログラムは先へ進んでしまいます。連続して再生する場合は下記のように
再生の終了を待ってから次のファイルを再生します。
こうしないと、次々に新しいファイルを再生してしまい、何重奏にもなってしまいます。
PlayMusic pm = new PlayMusic();
String tmps = "c:\\mousugunerujikan.wav";
pm.play( tmps );
do{}while( pm.flug );
pm.flug = true;
tmps = "c:\\mousugunerujikan2.wav";
pm.play( tmps );
java音楽音声ファイル再生classのソースコード
以下PlayMusic.javaファイルのソースです。コピペして使ってみてください。
package tomojavalib.util;
import java.io.File;
import java.io.IOException;
import java.net.MalformedURLException;
import java.net.URL;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.media.*;
/**
*
* @author to.tomo.net
*音声ファイルを再生するClassです。
*/
public class PlayMusic {
boolean flug = true;
public static void main(String[] args) {
PlayMusic pm = new PlayMusic();
String tmps = "";
tmps = "c:\\mousugunerujikan2.wav";
pm.play( tmps );
System.out.println("end2");
do{}while( pm.flug );
pm.flug = true;
pm.play( tmps );
System.out.println("end3");
}
public void play(String filename)
{
try {
File file = new File(filename);
URL url = file.toURL();
final Player player = Manager.createRealizedPlayer(url);
player.start();
player.addControllerListener(new ControllerAdapter(){
public void endOfMedia(EndOfMediaEvent ev) {
System.out.println("end");
flug = false;
player.close();
return;
}
});
} catch (MalformedURLException ex) {
Logger.getLogger(PlayMusic.class.getName()).log(Level.SEVERE, null, ex);
} catch (IOException ex) {
Logger.getLogger(PlayMusic.class.getName()).log(Level.SEVERE, null, ex);
} catch (NoPlayerException ex) {
Logger.getLogger(PlayMusic.class.getName()).log(Level.SEVERE, null, ex);
} catch (CannotRealizeException ex) {
Logger.getLogger(PlayMusic.class.getName()).log(Level.SEVERE, null, ex);
}
return;
}
}
最終更新日: 2018-02-13 07:44:00