JavaFXvideo无法播放

我遵循了一些关于将JavaFX与Swing(JFrame)结合起来播放video的教程,但我得到的只是一个黑屏,其中video应该没有任何实际内容播放,也没有报告任何错误。

我在这里做错了什么,为什么video不播放?

我尝试了几个.flvvideo,其中没有一个会开始播放(当我在浏览器中打开它们时,它们会播放)

我在安装了K-lite完整编解码器包的Windows 8.1 N Pro上运行jre7和jdk1.7.0_45

编辑:更新我的代码后jewelsea的评论,没有任何改变,黑盒仍然出现没有内容播放,控制台没有显示任何文字出现

package com.example.test; import javafx.application.Platform; import javafx.embed.swing.JFXPanel; import javafx.event.Event; import javafx.event.EventHandler; import javafx.scene.Group; import javafx.scene.Scene; import javafx.scene.SceneBuilder; 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 javax.swing.*; public class Main { public static void main(String[] args) { SwingUtilities.invokeLater(new Runnable() { @Override public void run() { initAndShowGUI(); } }); } private static void initAndShowGUI() { // This method is invoked on the EDT thread JFrame frame = new JFrame("Test"); final JFXPanel fxPanel = new JFXPanel(); frame.add(fxPanel); frame.setSize(640, 480); frame.setVisible(true); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); Platform.runLater(new Runnable() { @Override public void run() { initFX(fxPanel); } }); } private static void initFX(JFXPanel fxPanel) { // This method is invoked on the JavaFX thread Scene scene = createScene(); fxPanel.setScene(scene); } private static Scene createScene() { String source; Media media; MediaPlayer mediaPlayer; MediaView mediaView = null; try { media = new Media("http://download.oracle.com/otndocs/products/javafx/oow2010-2.flv"); 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); mediaPlayer.setAutoPlay(true); 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); mediaView.setOnError(new EventHandler() { public void handle(MediaErrorEvent t) { // Handle asynchronous error in MediaView. System.out.println("Handle asynchronous error in MediaView: "+ t.getMediaError()); } @Override public void handle(Event arg0) { // TODO Auto-generated method stub System.out.println("Handle asynchronous error in MediaView arg0: "+arg0.toString()); } }); } else { // Handle synchronous error creating MediaPlayer. System.out.println("Handle synchronous error creating MediaPlayer"); } } catch (Exception mediaPlayerException) { // Handle exception in MediaPlayer constructor. System.out.println("Handle exception in MediaPlayer constructor: "+ mediaPlayerException.getMessage()); } } else { // Handle synchronous error creating Media. System.out.println("Handle synchronous error creating Media"); } } catch (Exception mediaException) { // Handle exception in Media constructor. System.out.println("Handle exception in Media constructor: "+mediaException.getMessage()); } Group root = new Group(); Scene scene = SceneBuilder.create().width(640).height(480).root(root).fill(Color.WHITE).build(); if(mediaView != null) { root.getChildren().add(mediaView); } return scene; } } 

所以我安装了windows mediafunction包以便adobe premiere pro工作(因为它需要一个来自windows media player的dll文件(我没有安装,因为我运行N版本的Windows)现在video确实播放了为了我。

我不能说100%确认原因是没有安装WMP,因为媒体function包可能已经安装了其他解决了我的问题,但问题解决了:)

我要感谢其他尝试的答案,我真的很感激。

如果我正在写这个答案,请不要介意。 我知道这是一个非常古老的问题但这个答案可能对其他人有所帮助。 我目前正在开发一个JavaFX应用程序,它需要根据其类型执行文件。 我的应用程序第一次播放video但是当我点击另一个mp4video文件时它没有播放。 这是我的初始代码。

 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); mediaView = new MediaView(mediaPlayer); runnable = () -> { System.out.println("Inside runnable VideoProcesser Thread = " + Thread.currentThread().getName()); mediaPlayer.play(); }; mediaPlayer.setOnReady(runnable); setVideoMediaStatus(PLAYING); pane.getChildren().add(mediaView); } 

然后,由于video播放器屏幕很暗,我认为问题是媒体视图,所以我添加了以下两行,

  if(mediaView == null) { mediaView = new MediaView(mediaPlayer); } mediaView.setMediaPlayer(mediaPlayer); 

现在,当我点击不同的video时,我的应用程序就可以了。 这是完整的代码。

 Media media; MediaPlayer mediaPlayer; MediaView 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); } 

请注意,如果您使用FXML实例化mediaView,则不要再次实例化它。 再次实例化可能会使mediaView失去原始节点的引用。 请参阅此帖并通过itachi回答, javafx mediaview只播放音频

试试这个,它对我有用:

 package de.professional_webworkx.swing; import javafx.application.Platform; import javafx.embed.swing.JFXPanel; import javafx.scene.Group; import javafx.scene.Scene; import javafx.scene.SceneBuilder; import javafx.scene.media.Media; import javafx.scene.media.MediaPlayer; import javafx.scene.media.MediaView; import javax.swing.JFrame; public class MyFrame extends JFrame { /** * */ private static final long serialVersionUID = 1L; /** * Create a new Frame, set title, ... */ public MyFrame() { this.setTitle("Swing and JavaFX"); this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); this.setSize(1024, 768); // create a JFXPanel final JFXPanel jfxPanel = new JFXPanel(); // add the jfxPanel to the contentPane of the JFrame this.getContentPane().add(jfxPanel); this.setVisible(true); Platform.runLater(new Runnable() { @Override public void run() { jfxPanel.setScene(initScene()); } }); } public static final void main (String[] args) { new MyFrame(); } /** * init the JFX Scene and * @return scene */ private Scene initScene() { Group root = new Group(); SceneBuilder sb = SceneBuilder.create().width(640).height(400).root(root); Media video = new Media("http://download.oracle.com/otndocs/products/javafx/oow2010-2.flv"); MediaPlayer mediaPlayer = new MediaPlayer(video); mediaPlayer.setAutoPlay(true); mediaPlayer.play(); MediaView view = new MediaView(mediaPlayer); root.getChildren().add(view); Scene scene = sb.build(); return scene; } } 

帕特里克

我拿了你的代码并尝试在我的机器上运行它(Win7 JDK 1.7.0_25)并得到了相同的结果。 黑匣子,没有video。

我注意到你没有设置mediaPlayer.setAutoPlay(true)所以我在mediaPlayer传递给MediaView之前createScene()这个调用添加到了createScene() 。 现在回放似乎对我有用。

 // ... prior code omitted // added this to OP's code mediaPlayer.setAutoPlay(true); mediaView = new MediaView(mediaPlayer); mediaView.setOnError(new EventHandler() { public void handle(MediaErrorEvent t) { // Handle asynchronous error in MediaView. System.out.println("Handle asynchronous error in MediaView: "+ t.getMediaError()); } // ... additional code omitted 

编辑: autoPlay属性默认为false – 您可以调用mediaPlayer.isAutoPlay()来检查这一点。 如果不调用mediaPlayer.setAutoPlay(true)mediaPlayer.play() ,video将永远不会开始播放。

编辑2:我刚刚在另一个答案的评论中注意到你在JavaFX之外播放video时遇到了麻烦。 如果您还没有安装它,请尝试下载VLC以查看video是否可以使用该video播放。 我相信安装ffdshow试用版将提供必要的编解码器来在Windows Media Player中播放FLV。 (虽然我认为所有版本的K-lite编解码器包都包含FLV支持)