无法使用 JavaFX MediaPlayer 播放视频
Unable to play video using JavaFX MediaPlayer
在我的 fxml 文件中有:
<AnchorPane prefHeight="500.0" prefWidth="500.0" xmlns:fx="http://javafx.com/fxml/1" xmlns="http://javafx.com/javafx/8.0.40">
<children>
<Button layoutX="14.0" layoutY="461.0" mnemonicParsing="false" text="Dummy Button" />
<MediaView id="videoView" fitHeight="400.0" fitWidth="450.0" layoutX="14.0" layoutY="14.0" />
</children>
</AnchorPane>
这是我的代码:
File f = new File("video.mp4");
Media media = new Media(f.toURI().toString());
MediaPlayer mediaPlayer = new MediaPlayer(media);
mediaPlayer.setAutoPlay(true);
MediaView mediaView = (MediaView) videoLayout.lookup("#videoView");
mediaView.setMediaPlayer(mediaPlayer);
出现虚拟按钮,以便正确加载布局。没有异常或错误,但仍然没有任何反应。我没有看到任何视频帧,没有播放任何内容。我是 运行 Windows 上的代码 7. 我做错了什么?
编辑:
代码没问题。只是并非我所有的测试内容都得到支持。如下所示,最好检查播放器状态:
mediaPlayer.setOnError(()->System.out.println("media error"
+ mediaPlayer.getError().toString()));
到目前为止我遇到了 3 个问题:
- 打印错误"ERROR_MEDIA_CORRUPTED: ERROR_MEDIA_CORRUPTED"
- 没有打印错误但只播放了音频
- 异常被抛出"MediaException: MEDIA_UNSUPPORTED : Unrecognized file signature!"
检查媒体是否受支持:
mediaPlayer.setOnError(()->
System.out.println("media error"+mediaPlayer.getError().toString()));
如果有MediaException
,比如不支持音频格式,您将看不到视频,但应用程序会正常启动。
请注意,您可以尝试其他方法,将所有代码嵌入到 FXML 文件中:
<MediaView id="videoView" fitHeight="400.0" fitWidth="450.0" layoutX="14.0" layoutY="14.0">
<mediaPlayer>
<MediaPlayer autoPlay="true">
<media>
<Media source="@video.mp4" />
</media>
</MediaPlayer>
</mediaPlayer>
</MediaView>
为了帮助别人,写下这个问题的答案。这可能会有所帮助。
创建视频播放器时,不应重新初始化 mediaView。如果您将重新初始化 mediaView,则 mediaView 将丢失原始节点的引用。您只需要为您的 mediaView 设置一个 mediaPlayer 并检查 mediaView 的空引用。如果mediaView为null,则实例化。
参考下面url,看itachi给出的答案。
javafx mediaview only the audio is playing
如果您不使用 FXML 加载程序来实例化 mediaView,则以下代码可能有效。它对我有用。
private void playVideo(String fileLocation) {
System.out.println("VideoProcesser Thread = " + Thread.currentThread().getName());
media = new Media(new File(fileLocation).toURI().toString());
mediaPlayer = new MediaPlayer(media);
// mediaPlayer.setAutoPlay(true);
if(mediaView == null) {
mediaView = new MediaView(mediaPlayer);
}
mediaView.setMediaPlayer(mediaPlayer);
mediaPlayer.play();
mediaPlayer.setOnError(() -> System.out.println("Current error: "+mediaPlayer.getError()));
setVideoMediaStatus(PLAYING);
pane.getChildren().add(mediaView);
}
在 ubuntu 17.10 中,libavcodec 存在一些问题。
javafx 搜索 libavcodec53 但 ubuntu 17.10 带有更高版本
您可以通过执行以下操作来解决此问题:
- 安装 libavcodec57、extras 和 dev
sudo apt-get install libavcodec57;
sudo apt-get install libavcodec-extra;
sudo apt-get install libavcodec-dev
2.create 符号链接
cd /usr/lib/x86_64-linux-gnu
sudo ln -s libavcodec.so libavcodec.so.53
当 javafx 搜索 libavcodec53 时,我们现在指向 libavcodec57。
在我的 fxml 文件中有:
<AnchorPane prefHeight="500.0" prefWidth="500.0" xmlns:fx="http://javafx.com/fxml/1" xmlns="http://javafx.com/javafx/8.0.40">
<children>
<Button layoutX="14.0" layoutY="461.0" mnemonicParsing="false" text="Dummy Button" />
<MediaView id="videoView" fitHeight="400.0" fitWidth="450.0" layoutX="14.0" layoutY="14.0" />
</children>
</AnchorPane>
这是我的代码:
File f = new File("video.mp4");
Media media = new Media(f.toURI().toString());
MediaPlayer mediaPlayer = new MediaPlayer(media);
mediaPlayer.setAutoPlay(true);
MediaView mediaView = (MediaView) videoLayout.lookup("#videoView");
mediaView.setMediaPlayer(mediaPlayer);
出现虚拟按钮,以便正确加载布局。没有异常或错误,但仍然没有任何反应。我没有看到任何视频帧,没有播放任何内容。我是 运行 Windows 上的代码 7. 我做错了什么?
编辑:
代码没问题。只是并非我所有的测试内容都得到支持。如下所示,最好检查播放器状态:
mediaPlayer.setOnError(()->System.out.println("media error"
+ mediaPlayer.getError().toString()));
到目前为止我遇到了 3 个问题:
- 打印错误"ERROR_MEDIA_CORRUPTED: ERROR_MEDIA_CORRUPTED"
- 没有打印错误但只播放了音频
- 异常被抛出"MediaException: MEDIA_UNSUPPORTED : Unrecognized file signature!"
检查媒体是否受支持:
mediaPlayer.setOnError(()->
System.out.println("media error"+mediaPlayer.getError().toString()));
如果有MediaException
,比如不支持音频格式,您将看不到视频,但应用程序会正常启动。
请注意,您可以尝试其他方法,将所有代码嵌入到 FXML 文件中:
<MediaView id="videoView" fitHeight="400.0" fitWidth="450.0" layoutX="14.0" layoutY="14.0">
<mediaPlayer>
<MediaPlayer autoPlay="true">
<media>
<Media source="@video.mp4" />
</media>
</MediaPlayer>
</mediaPlayer>
</MediaView>
为了帮助别人,写下这个问题的答案。这可能会有所帮助。 创建视频播放器时,不应重新初始化 mediaView。如果您将重新初始化 mediaView,则 mediaView 将丢失原始节点的引用。您只需要为您的 mediaView 设置一个 mediaPlayer 并检查 mediaView 的空引用。如果mediaView为null,则实例化。
参考下面url,看itachi给出的答案。 javafx mediaview only the audio is playing
如果您不使用 FXML 加载程序来实例化 mediaView,则以下代码可能有效。它对我有用。
private void playVideo(String fileLocation) {
System.out.println("VideoProcesser Thread = " + Thread.currentThread().getName());
media = new Media(new File(fileLocation).toURI().toString());
mediaPlayer = new MediaPlayer(media);
// mediaPlayer.setAutoPlay(true);
if(mediaView == null) {
mediaView = new MediaView(mediaPlayer);
}
mediaView.setMediaPlayer(mediaPlayer);
mediaPlayer.play();
mediaPlayer.setOnError(() -> System.out.println("Current error: "+mediaPlayer.getError()));
setVideoMediaStatus(PLAYING);
pane.getChildren().add(mediaView);
}
在 ubuntu 17.10 中,libavcodec 存在一些问题。 javafx 搜索 libavcodec53 但 ubuntu 17.10 带有更高版本
您可以通过执行以下操作来解决此问题:
- 安装 libavcodec57、extras 和 dev
sudo apt-get install libavcodec57;
sudo apt-get install libavcodec-extra;
sudo apt-get install libavcodec-dev
2.create 符号链接
cd /usr/lib/x86_64-linux-gnu
sudo ln -s libavcodec.so libavcodec.so.53
当 javafx 搜索 libavcodec53 时,我们现在指向 libavcodec57。