2013-12-15 198 views
7

我跟着一些关于将JavaFX和Swing结合起来的教程(JFrame)来播放视频,但是我得到的只是一个黑屏,视频应该没有任何实际内容播放,也没有错误报告。JavaFX视频没有播放

我在这里做错了什么,为什么不玩视频播放?

我试了几个FLV的视频,他们都将开始播放,我在Windows上运行jre7和jdk1.7.0_45 8.1ñ临用(他们当我在浏览器中打开他们一起玩)

K-精简版全编解码器包安装

编辑: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; 
    } 
} 
+0

在JavaFX捕捉媒体错误是挑剔的。 JavaFX media javadoc中有一个[error catchching template](http://docs.oracle.com/javafx/2/api/javafx/scene/media/package-summary.html)。在你的程序中实现模板并用你的结果更新问题。还要检查你的非oracle flv文件是否是vp6编码的。 – jewelsea

+0

我添加了模板,遗憾的是没有抛出任何异常 – xorinzor

+0

您是否尝试在纯FX应用程序中播放该视频? –

回答

2

因此,我安装了Windows媒体功能包,以获得Adobe Premiere Pro工作(因为它需要一个dll文件从Windows媒体播放器没有安装,因为我运行了N版本的Windows),现在视频确实为我玩了。

我不能说100%的确认原因是没有安装WMP,因为媒体功能包可能会以及安装了其他东西,解决了我的问题,但问题解决:)

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

+0

同样适用于我 - 没有声音,没有错误,没有任何...直到我在http://www.microsoft.com/en-us/download/details.aspx?id=40744上安装了Windows Media功能包 –

0

试试这个,它为我工作:

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; 

    } 
} 

帕特里克

+0

不幸的是,这也只是在窗口内提供了一个黑匣子,它似乎好像视频不会加载,但没有异常或返回 – xorinzor

+0

您使用JDK> = 1.7 Update 10并手动将jfxrt.jar添加到Classpath中? – Patrick

+0

是的,这是正确的 – xorinzor

0

我把你的代码,并试图在我的机器(Win7的JDK 1.7.0_25)上运行,并得到了相同的结果。黑盒子,没有视频。

我注意到您没有设置mediaPlayer.setAutoPlay(true)所以我加了权之前mediaPlayer传递给MediaViewcreateScene()这一呼吁。现在播放似乎为我工作。

// ... 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(),视频将永远不会播放。

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

+0

我添加了自动播放功能(必须在某个地方下滑,我原来是这么做的),并安装了ffdshow试用版(我已经安装了VLC),但仍然没有播放 – xorinzor

1

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

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); 
    } 

则因为视频播放器屏幕一片漆黑,我认为问题是与媒体的看法,所以我添加了以下两个行,

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

现在,当我点击不同的视频我的应用程序玩得很好。 以下是完整的代码。

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 only the audio is playing