5

私はこれが繰り返しの質問であることを知っています. ここまたはここで元のものを確認してください。

だから私のコードは単なるコピーペーストです:

import javafx.scene.media.*;

class Gui {
  public static void main(String[] args) {
    try{
        Media hit = new Media("skin.mp3");
        MediaPlayer mediaPlayer = new MediaPlayer(hit);
        mediaPlayer.play();
    }catch(Exception e){
        e.printStackTrace();
    }
  }
}

私が得ている例外は次のとおりです。

java.lang.IllegalArgumentException: uri.getScheme() == null!
        at com.sun.media.jfxmedia.locator.Locator.<init>(Locator.java:217)
        at javafx.scene.media.Media.<init>(Media.java:364)
        at Gui.main(gui.java:6)

jfxrt.jarクラスパスにファイルを含めることにより、正しくコンパイルおよび実行しています

注: IDE の代わりにメモ帳を使用しています。

だから誰か理由を教えてくれIllegalArgumentException

ありがとう

更新:それを使用file://e:/skin.mp3するとうまくいきましたが、別の例外がありました:

MediaException: MEDIA_INACCESSIBLE : e
        at javafx.scene.media.Media.<init>(Unknown Source)
        at Gui.main(gui.java:6)

したがって、この例外に光を当てることができれば。

ちなみに、曲をチェックしたところ、vlcでうまく再生されているため、破損していません。

4

2 に答える 2

5

JavaFX API ドキュメントから

  • 提供される URI は、java.net.URI で要求される RFC-2396 に準拠する必要があります。
  • HTTP、FILE、および JAR URI のみがサポートされています。

したがって、ドキュメントを読むと、URI パスを指定する必要があると思われます。

file://path/to/file/skin.mp3おそらくうまくいくでしょう。

于 2012-08-27T04:04:58.523 に答える
4

この質問のコードにはいくつかの問題があります。

  1. クラスは public である必要があります。
  2. JavaFX 2 アプリケーションは Application クラスを拡張する必要があります。
  3. JavaFX 2 アプリケーションでは、start メソッドを定義する必要があります。
  4. 作成中のメディアのロケーターは、MadProgrammer で指摘されているように、完全な URI である必要があります。

質問には javafx-2 タグが付いていますが、JavaFX 1.x JavaFX Script (現在サポートされていないプログラミング言語であり、JavaFX 2 と互換性がありません) 用に書かれているのだろうかと思います。もしそうなら、Java でコーディングし、JavaFX Script ではなく JavaFX 2.x を使用することをお勧めします。

Windows では、URI の絶対ロケータのファイル表現には、ファイル プロトコルの後に 3 つのスラッシュがあります。たとえば、次は有効です。

file:///C:/Users/Public/Music/skin.mp3

何らかの理由で、単一のスラッシュも機能します (内部的に Java がファイルのプロトコル指定子の余分な // を補間するか、URL 仕様に理解できないものがあると思います。つまり、 // プロトコルの後)。

ファイル:/C:/Users/Public/Music/skin.mp3

ファイル uri をチェックする 1 つの方法は、ファイル uri が存在するかどうかを確認することです。

System.out.println("File " + filename + " exists? " + new File(filename).exists()); 

ファイル uri が有効であることを確認したら、それを使用して文字列に変換できます。

file.toURI().toURL().toExternalForm()

これは、MediaPlayer を使用して JavaFX でオーディオを再生するための短いサンプル プログラムです。エラー処理が多少含まれているため、問題が発生した場合に理解しやすくなっています。

import java.io.File;
import java.net.MalformedURLException;
import javafx.application.Application;
import javafx.scene.Scene;
import javafx.scene.control.Label;
import javafx.scene.layout.StackPane;
import javafx.scene.media.*;
import javafx.scene.paint.Color;
import javafx.stage.Stage;

/** plays an audio in JavaFX 2.x */
public class SimpleAudioPlayer extends Application {
  public static void main(String[] args) { launch(args); }
  @Override public void start(Stage stage) throws MalformedURLException {
    final Label status = new Label("Init");
    MediaPlayer mediaPlayer = createMediaPlayer(
      "C:/Users/Public/Music/Sample Music/Future Islands - Before the Bridge.mp3", 
      status
    );
    StackPane layout = new StackPane();
    layout.getChildren().addAll(status);
    stage.setScene(new Scene(layout, 600, 100, Color.CORNSILK));
    stage.show();
    if (mediaPlayer != null) {
      mediaPlayer.play();
    }  
  }

  /** 
   * creates a media player using a file from the given filename path 
   * and tracks the status of playing the file via the status label 
   */
  private MediaPlayer createMediaPlayer(final String filename, final Label status) throws MalformedURLException {
    File file = new File(filename);
    if (!file.exists()) {
      status.setText("File does not exist: " + filename);
    }
    final String mediaLocation = file.toURI().toURL().toExternalForm();
    Media media = new Media(mediaLocation);
    MediaPlayer mediaPlayer = new MediaPlayer(media);
    mediaPlayer.setOnError(new Runnable() {
      @Override public void run() {
        status.setText("Error");
      }
    });
    mediaPlayer.setOnPlaying(new Runnable() {
      @Override public void run() {
        status.setText("Playing: " + mediaLocation);
      }
    });
    mediaPlayer.setOnEndOfMedia(new Runnable() {
      @Override public void run() {
        status.setText("Done");
      }
    });
    return mediaPlayer;
  }
}

特定のディレクトリ内のすべての mp3 ファイルを順番に再生する JavaFX 2.x メディア プレーヤーの追加の例へのリンクを次に示します。

于 2012-08-27T17:33:08.750 に答える