質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
JavaFX

JavaFXとは、Java仮想マシン上で動作するリッチインターネットアプリケーション (RIA) のGUIライブラリです。Swingとは異なり、FXMLと呼ばれる XMLとCSSを併用してデザインを記述します。

Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

Q&A

解決済

1回答

3472閲覧

JavaFXでのMP3ファイル再生時のラグが大きいです.

退会済みユーザー

退会済みユーザー

総合スコア0

JavaFX

JavaFXとは、Java仮想マシン上で動作するリッチインターネットアプリケーション (RIA) のGUIライブラリです。Swingとは異なり、FXMLと呼ばれる XMLとCSSを併用してデザインを記述します。

Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

0グッド

0クリップ

投稿2016/10/18 10:32

編集2016/10/18 13:09

###はじめに
JavaFXを用いてアプリケーションを作っています.
その中で,クリック時などに効果音を付けたいと思っています.
再生することはできたのですが,そのラグが大きかったので質問します.

###実現したいこと
ラグを人間が気にならない程度に抑えて,実行できるようにすること.

下記のコードだとクリックしてから再生されるまでの時間が大きすぎます.
理想は,クリックと同時になっていると人間が思えることです.

###ソースコード

効果音を再生するクラス.

Java

1import java.nio.file.Path; 2 3import javafx.scene.media.AudioClip; 4 5public class MySoundPlayer implements Runnable{ 6 private AudioClip clip; 7 8 public MySoundPlayer(Path path){ 9 this.clip = new AudioClip(path.toUri().toString()); 10 } 11 12 @Override 13 public void run(){ 14 try{ 15 this.clip.play(); 16 while(clip.isPlaying()) ; 17 }catch(Exception e){ 18 e.printStackTrace(); 19 } 20 } 21} 22

上記のクラスのテスター.

Java

1import java.nio.file.Paths; 2import javafx.scene.media.AudioClip; 3 4public class SoundTester extends javafx.application.Application{ 5 public static void main(String[] args) throws Exception{ 6 launch(args); 7 } 8 9 @Override 10 public void start(javafx.stage.Stage stage){ 11 javafx.scene.control.Button btnPlay = new javafx.scene.control.Button("再生"); 12 btnPlay.setPrefSize(100,30); 13 btnPlay.setOnAction(event -> { 14 try{ 15 //カレントディレクトリに"click.mp3"が存在すると仮定します. 16 MySoundPlayer mp3player = new MySoundPlayer(Paths.get("click.mp3")); 17 Thread thread = new Thread(mp3player); 18 thread.start(); 19 }catch(Exception e){ 20 e.printStackTrace(); 21 } 22 }); 23 24 javafx.scene.layout.VBox vbox = new javafx.scene.layout.VBox(btnPlay); 25 vbox.setAlignment(javafx.geometry.Pos.CENTER); 26 27 stage.setHeight(100); 28 stage.setWidth(275); 29 stage.setTitle("クリック音テスト"); 30 stage.setScene(new javafx.scene.Scene(vbox)); 31 stage.show(); 32 } 33} 34 35

###質問
0. 現在のラグの原因はなんでしょうか?
0. ラグを人間が気にならないようなレベルにするにはどうすればいいでしょうか.

具体的なソースコードをつけて解答いただけると幸いです.

###補足など

2016/10/18 22:10 質問内容を追加しました.

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

長時間再生するような巨大なサウンドクリップなら再生開始時にスレッド開始、クリップ読み込み(と並行して再生開始)というふうにすると思いますが、即座に再生したいような短いサウンドクリップならあらかじめメモリーに読み込み即座に再生を開始するべきだと思います。

スレッドを起動する時間も気になるほど大きいなら常時専用スレッドを起動しておく方がよいかも知れません。スレッドプールサポート用クラスもあるのですが、もし大がかりなマルチスレッドのアプリケーションを作るのではなくとりあえずサウンドクリップを鳴らすだけといったものであれば自前で一つスレッドを起こして処理したほうがかえって簡単な気がします。

追記:

UIスレッドから別スレッドをたたき起こすというのが最初難しいと思うのでその例をかいてみます。必ずしもよいコードではないのでもっとスッキリした書き方もあるようにも思いますが。コメントつける代わりに変数やメソッド名に日本語つかってます。
クリップを一度だけロードして繰り返し鳴らすのはClipのリファレンスをみてトライしてみてください。

class Boo { Object lock = new Object(); boolean 鳴らすのは今; public static void main(...) { Thread t = new Thread(() -> クリップスレッドの処理()); t.setDaemon(true); t.start(); ... 画面をつくって表示 } // 鳴らしたいときJavaFXアプリケーションスレッドからこれを直接呼び出せます static void クリップスレッドさん再生してください() { synchronized (lock) { 鳴らすのは今 = true; lock.notify(); } } void クリップスレッドの処理() { try { for (;;) { // アプリケーション終了まで無限ループ synchornized (lock) { lock.wait(); } System.out.println("デバッグ用: スレッドが起きました"); if (鳴らすのは今) { 鳴らすのは今 = false; ...音を鳴らす処理 } } } catch (InterruptedException e) { ; } } }

投稿2016/10/18 11:13

編集2016/10/18 15:24
KSwordOfHaste

総合スコア18394

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

退会済みユーザー

退会済みユーザー

2016/10/18 13:16

>あらかじめメモリーに読み込み即座に再生を開始するべきだと思います とのことですが,初心者故に具体的にどのようなコードを書くべきなのかわかりません. サンプルコードを教えていただけないでしょうか.
KSwordOfHaste

2016/10/18 15:26

ところどろこ3点リーダー(...)で省略してますがスレッドのコード例を挙げてみました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問