我想使用媒体类在 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.
最佳答案
原始问题的答案
要解决您的 URISyntaxException,您可以将有效的 URL 传递给您的媒体构造函数(例如“file:///C:/Wildlife.wmv”)。
但是,即使那样,您也无法将媒体文件播放为 wmv is not a supported media container for JavaFX 2.2 .
评论补充问题的答案
Media arguments accepts a string which reperesents source file. So why the need of writing
file:///
?
因为 Media constructor documentation还指定了对输入字符串的约束:
- The supplied URI must conform to RFC-2396 as required by java.net.URI.
- Only HTTP, FILE, and JAR URIs are supported.
在 file:///C:/Wildlife.wmv
中,URI scheme 是 file:,//是权限,后面可以跟一个 windows 共享(如果有的话) ,下一个/是为了表明它的路径是从根目录开始的绝对路径而不是相对路径,然后是 windows 驱动器说明符 c:,然后是/表示 c 驱动器的根目录,然后是您的实际文件名 Wildlife.wmv。如果没有完整的地址,则输入格式不正确,因为 MediaPlayer 不知道要使用什么协议(protocol)来读取媒体(这就是 file:scheme 告诉它的内容),也不知道要播放的媒体的位置。
另请注意,您可以通过以下方式从文件中获取 URI 字符串:
new File(MEDIA_PATH).toURI().toURL().toExternalForm()
I did as you said,now a pop up comes but video is not playing.
好吧,我确实说过,即使您使用正确的路径来定位媒体文件,媒体也不会播放,因为不支持媒体容器格式 (wmv)。
media package javadoc捕获播放媒体时可能发生的潜在错误的综合示例(标题为错误处理),以便您可以捕获所有可能发生在错误可能发生的地方的所有错误,并使用拉取解释和堆栈跟踪记录它们以工作准确指出出了什么问题。
what changes do I have to make ?
您需要将您的媒体转换为 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 文件。
关于java - 使用 javafx 媒体类播放 wmv 文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19243772/