1

.wmvメディアクラスを使用してjavaFXで再生したかったのですが、これは私が試した次の方法です

import java.io.File;
import java.io.InputStreamReader;
import java.net.URI;
import java.net.URL;

import javafx.application.Application;
import javafx.scene.Group;
import javafx.scene.Scene;
import javafx.scene.media.Media;
import javafx.scene.media.MediaPlayer;
import javafx.scene.media.MediaView;
import javafx.scene.paint.Color;
import javafx.stage.Stage;

public class MoviePlayer extends Application{


public static void main (String [] args){
launch(args);
}

@Override
public void start(Stage stage) throws Exception {
    Group root = new Group();    
    try{
        //File f=new File("C:/Wildlife.wmv");
        //URI u=new URI("C:\\Wildlife.wmv");

    Media media = new Media("C:\\Wildlife.wmv");
    MediaPlayer player = new MediaPlayer(media);
    MediaView view = new MediaView(player);

    root.getChildren().add(view);
    Scene scene = new Scene(root, 400, 400, Color.BLACK);
    stage.setScene(scene);
    stage.show();

    player.play();
    }
    catch(Exception e)
    {
        e.printStackTrace();
    }
}}

しかし、次の例外をスローしています

java.net.URISyntaxException: Illegal character in opaque part at index 2: C:\Wildlife.wmv
    at java.net.URI$Parser.fail(Unknown Source)
    at java.net.URI$Parser.checkChars(Unknown Source)
    at java.net.URI$Parser.parse(Unknown Source)
    at java.net.URI.<init>(Unknown Source)
    at MoviePlayer.start(MoviePlayer.java:27)
    at com.sun.javafx.application.LauncherImpl$5.run(LauncherImpl.java:319)
    at com.sun.javafx.application.PlatformImpl$5.run(PlatformImpl.java:215)
    at com.sun.javafx.application.PlatformImpl$4$1.run(PlatformImpl.java:179)
    at com.sun.javafx.application.PlatformImpl$4$1.run(PlatformImpl.java:176)
    at java.security.AccessController.doPrivileged(Native Method)
    at com.sun.javafx.application.PlatformImpl$4.run(PlatformImpl.java:176)
    at com.sun.glass.ui.win.WinApplication._runLoop(Native Method)
    at com.sun.glass.ui.win.WinApplication.access$100(WinApplication.java:29)
    at com.sun.glass.ui.win.WinApplication$3$1.run(WinApplication.java:73)
    at java.lang.Thread.run(Unknown Source)

誰でもそれを解決する方法を教え て ください ここに画像の説明を入力

以下は、エラー処理後のコードとスクリーンショットです

  import java.io.File;
import java.io.InputStreamReader;
import java.net.URI;
import java.net.URL;

import javafx.application.Application;
import javafx.event.Event;
import javafx.event.EventHandler;
import javafx.scene.Group;
import javafx.scene.Scene;
import javafx.scene.media.Media;
import javafx.scene.media.MediaErrorEvent;
import javafx.scene.media.MediaPlayer;
import javafx.scene.media.MediaView;
import javafx.scene.paint.Color;
import javafx.stage.Stage;

public class MoviePlayer extends Application{


public static void main (String [] args){
launch(args);
}

@Override
public void start(Stage stage) throws Exception {
    Group root = new Group();    
    String source="file:///C:/share/test.mp4";
    Media media;
    MediaPlayer mediaPlayer;
    MediaView mediaView;
    try {
        media = new Media(source);
        if (media.getError() == null) {
            media.setOnError(new Runnable() {
                public void run() {
                    // Handle asynchronous error in Media object.
                    System.out.println("Handle asynchronous error in Media object");
                }
            });
            try {
                mediaPlayer = new MediaPlayer(media);
                if (mediaPlayer.getError() == null) {
                    mediaPlayer.setOnError(new Runnable() {
                        public void run() {
                            // Handle asynchronous error in MediaPlayer object.
                            System.out.println("Handle asynchronous error in MediaPlayer object.");
                        }
                    });
                    mediaView = new MediaView(mediaPlayer);
                    root.getChildren().add(mediaView);
                    Scene scene = new Scene(root, 400, 400, Color.BLACK);
                    stage.setScene(scene);
                    stage.show();

                    mediaPlayer.play();
                    mediaView.setOnError(new EventHandler() {
                        public void handle(MediaErrorEvent t) {
                            // Handle asynchronous error in MediaView.
                            System.out.println("Handle asynchronous error in MediaView");
                        }

                        @Override
                        public void handle(Event arg0) {
                            // TODO Auto-generated method stub

                        }
                    });
                } else {
                    // Handle synchronous error creating MediaPlayer.
                    System.out.println("Handle synchronous error creating MediaPlayer");
                }
            } catch (Exception mediaPlayerException) {
                mediaPlayerException.printStackTrace();
                // Handle exception in MediaPlayer constructor.
            }
        } else {
            // Handle synchronous error creating Media.
        }
    } catch (Exception mediaException) {
        mediaException.printStackTrace();
        // Handle exception in Media constructor.
    }
    ////////////////////////////////////
  /*  try{
        //File f=new File("C:/Wildlife.wmv");
        //URI u=new URI("C:\\Wildlife.wmv");

    Media media = new Media("file:///C:/share/test.mp4");
    MediaPlayer player = new MediaPlayer(media);
    MediaView view = new MediaView(player);

    root.getChildren().add(view);
    Scene scene = new Scene(root, 400, 400, Color.BLACK);
    stage.setScene(scene);
    stage.show();

    player.play();
    }
    catch(Exception e)
    {
        e.printStackTrace();
    }*/
}}

そして、これは例外を処理した後の出力です

Handle asynchronous error in MediaPlayer object.
Handle asynchronous error in Media object
Handle asynchronous error in MediaPlayer object.

ここに画像の説明を入力

4

2 に答える 2

4

元の質問への回答

URISyntaxException を解決するには、有効な URL をメディア コンストラクターに渡すことができます (たとえば、「file:///C:/Wildlife.wmv」)。

ただし、それでもwmv は JavaFX 2.2 でサポートされているメディア コンテナーではないため、メディア ファイルを再生することはできません。

コメントからの補足質問への回答

メディア引数は、ソース ファイルを表す文字列を受け入れます。では、なぜ書く必要があるのfile:///でしょうか。

Media コンストラクターのドキュメントでは、入力文字列に対する制約も指定されているため、次のようになります。

ではfile:///C:/Wildlife.wmv、URI スキームは file: です。// は機関であり、Windows 共有が続く可能性があります (存在する場合)。次の / は、パスが相対パスではなくルートからの絶対パスであることを示します。 Windows ドライブ指定子 c:、c ドライブのルートを示す /、実際のファイル名 Wildlife.wmv があります。完全なアドレスがないと、MediaPlayer がメディアを読み取るために使用するプロトコル (つまり、file: スキームが指示するもの) も、再生するメディアの場所もわからないため、入力の形式が正しくありません。

また、次の方法でファイルから URI 文字列を取得できることにも注意してください。

new File(MEDIA_PATH).toURI().toURL().toExternalForm()

あなたが言ったようにしましたが、ポップアップが表示されますが、ビデオは再生されません。

メディア ファイルの場所を特定するために正しいパスを使用しても、メディア コンテナー形式 (wmv) がサポートされていないため、メディアは再生されません。

メディアの再生時に発生する可能性のある潜在的なエラーをキャッチするためのメディア パッケージの javadocの包括的な例 (「エラー処理」というタイトル)スタック トレースを使用して、何が問題なのかを正確に突き止めます。


どのような変更を加える必要がありますか?

メディアを、JavaFX 2.2 が処理でき、ターゲット マシンで適切なコーデックを使用できる形式に変換する必要があります。JavaFX を使用できる場所で再生したい場合は、VP6 でエンコードされた FLV に変換できます。ただし、これはそれほど一般的な形式ではないため、その変換を行うためのツールを見つけるのが難しい場合があります。代わりに、WMV を MP4 コンテナー内の H.264 でエンコードされたビデオに変換し、プラットフォームに適切なコーデックがインストールされていることを確認できます (コーデックの取得に関する JavaFX でサポートされている構成に関する情報の JavaFX メディア セクションを参照してください)。wmv ファイルの変換に使用できるWMV から MP4 へのコンバーター プログラムを Google で検索できます。

于 2013-10-08T15:39:42.847 に答える
1

あなたはこれを試すことができます:

File f = new File("C:\\Wildlife.wmv");

URI u = f.toURI();

あなたができるURLが必要な場合f.toURI().toURL()

次に、メディアをインスタンス化します。

教えてください。

于 2013-10-08T09:37:27.633 に答える