【问题标题】:playing wmv files using javafx media class使用 javafx 媒体类播放 wmv 文件
【发布时间】:2013-10-08 09:21:21
【问题描述】:

我想使用媒体类在 javaFX 中播放 .wmv,这是我尝试过的以下方式

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.

【问题讨论】:

    标签: java javafx-2 javafx


    【解决方案1】:

    原始问题的答案

    要解决您的 URISyntaxException,您可以将有效的 URL 传递给您的媒体构造函数(例如“file:///C:/Wildlife.wmv”)。

    但是,即使那样,您也无法以wmv is not a supported media container for JavaFX 2.2 的身份播放媒体文件。

    评论补充问题的答案

    Media 参数接受代表源文件的字符串。 那么为什么需要写file:///呢?

    因为Media constructor documentation 还指定了输入字符串的约束:

    • 提供的 URI 必须符合 java.net.URI 要求的 RFC-2396。
    • 仅支持 HTTP、FILE 和 JAR URI。

    file:///C:/Wildlife.wmv 中,URI 方案是 file:, // 是权限,后面可以跟一个 windows 共享(如果有的话),下一个 / 表示它的路径是绝对的root 而不是相对的,然后是 windows 驱动器说明符 c:,然后是 / 表示 c 驱动器的根目录,然后是您的实际文件名 Wildlife.wmv。如果没有完整地址,则输入格式不正确,因为 MediaPlayer 不知道使用什么协议来读取媒体(即文件:方案告诉它的内容),也不知道在哪里找到要播放的媒体。

    另请注意,您可以通过以下方式从文件中获取 URI 字符串:

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

    我按照你说的做了,现在弹出一个但视频没有播放。

    我确实说过,即使您使用正确的路径来定位媒体文件,媒体也不会播放,因为不支持媒体容器格式 (wmv)。

    media package javadoc 综合示例(标题为“错误处理”)捕获播放媒体时可能发生的潜在错误,以便您可以捕获在可能发生错误的许多地方可能发生的所有错误,并使用提取解释和堆栈跟踪以准确找出问题所在。


    我必须做出哪些改变?

    您需要将您的媒体转换为 JavaFX 2.2 能够处理的格式,并且您的目标机器上有相应的编解码器可用。如果您希望它在任何可以使用 JavaFX 的地方播放,那么您可以将其转换为 VP6 编码的 FLV。但是,这不是一种常见的格式,因此您可能很难找到进行该转换的工具。相反,您可以将 WMV 转换为 MP4 容器中的 H.264 编码视频,并确保您的平台安装了正确的编解码器(请参阅JavaFX Media section of JavaFX Supported Configurations information on obtaining codecs)。您可以使用google for a WMV to MP4 converter program 来转换您的 wmv 文件。

    【讨论】:

    • 感谢您的回答及其有用的+1。但我有一个查询,根据docs.oracle.com/javafx/2/api/javafx/scene/media/Media.html 参数接受一个代表源文件的字符串。那么为什么需要编写文件: ///
    • 我按照你说的做了,现在弹出一个窗口,但视频没有播放。请问我需要做些什么改变吗?
    • 忘了说我现在使用的是mp4格式。正如你之前所说的不支持WMV所以尝试使用mp4但忘了提及
    • 如果您现在正在使用 MP4 编码,并且视频没有播放,请使用我在答案中链接的错误处理逻辑,如果您无法找出无法播放视频的原因,将任何结果堆栈跟踪添加到您的问题中。
    • 我没有收到任何错误,只是弹出来了黑色背景。你可以看到我附上的截图。
    【解决方案2】:

    你可以试试这个:

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

    如果你需要这个网址,你可以f.toURI().toURL()

    然后实例化媒体。

    试着告诉我们某事。

    【讨论】:

    • javaFX可以播放wmv文件吗
    • 我想是的,但我不是 javaFx 专家,你有一个 URISyntaxException..不是 MediaUnsupportedException
    猜你喜欢
    • 2012-12-02
    • 2010-10-14
    • 2013-11-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多