使用嵌入式JavaFX WebView进行Swing应用不会播放html5视频只有声音

问题描述:

在我的Swing应用程序中,我需要支持呈现html。所以我在我的Swing应用程序中嵌入了一个JavaFX WebView。现在在一些html页面上,我使用新的html5-Tag来播放视频。这在Windows和Linux上完美运行。但是在MacOS上,我只听到声音,看到黑色视频帧和底部的时间轨迹。使用嵌入式JavaFX WebView进行Swing应用不会播放html5视频只有声音

这是我从github得到的SSCCE。我只是将网址更改为包含html5视频标签示例的网址。如果你的MacOS用户可以试用它并告诉我你的电脑是否出现同样的情况,那将是非常棒的。当然,任何解决这个问题的想法都是值得赞赏的。

SSCCE:

import java.awt.BorderLayout; 
import java.awt.Dimension; 
import java.awt.event.ActionEvent; 
import java.awt.event.ActionListener; 

import javafx.application.Platform; 
import javafx.collections.ObservableList; 
import javafx.embed.swing.JFXPanel; 
import javafx.scene.Group; 
import javafx.scene.Node; 
import javafx.scene.Scene; 
import javafx.scene.web.WebEngine; 
import javafx.scene.web.WebView; 
import javafx.stage.Stage; 

import javax.swing.JButton; 
import javax.swing.JFrame; 
import javax.swing.JPanel; 
import javax.swing.SwingUtilities; 

import com.sun.javafx.application.PlatformImpl; 

/** 
* SwingFXWebView 
*/ 
public class JavaFXTest extends JPanel 
{ 
    private Stage  stage; 
    private WebView browser; 
    private JFXPanel jfxPanel; 
    private JButton swingButton; 
    private WebEngine webEngine; 
    private Object geo; 

    public JavaFXTest() 
    { 
     this.initComponents(); 
    } 

    public static void main(final String... args) 
    { 
     // Run this later: 
     SwingUtilities.invokeLater(new Runnable() 
     { 
      @Override 
      public void run() 
      { 
       final JFrame frame = new JFrame(); 
       frame.getContentPane().add(new JavaFXTest()); 
       frame.setMinimumSize(new Dimension(640, 480)); 
       frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
       frame.setVisible(true); 
      } 
     }); 
    } 

    private void initComponents() 
    { 
     this.jfxPanel = new JFXPanel(); 
     this.createScene(); 
     this.setLayout(new BorderLayout()); 
     this.add(this.jfxPanel, BorderLayout.CENTER); 
     this.swingButton = new JButton(); 
     this.swingButton.addActionListener(new ActionListener() 
     { 

      @Override 
      public void actionPerformed(final ActionEvent e) 
      { 
       Platform.runLater(new Runnable() 
       { 

        @Override 
        public void run() 
        { 
         JavaFXTest.this.webEngine.reload(); 
        } 
       }); 
      } 
     }); 
     this.swingButton.setText("Reload"); 
     this.add(this.swingButton, BorderLayout.SOUTH); 
    } 

    /** 
    * createScene Note: Key is that Scene needs to be created and run on 
    * "FX user thread" NOT on the AWT-EventQueue Thread 
    */ 
    private void createScene() 
    { 
     PlatformImpl.startup(new Runnable() 
     { 
      @Override 
      public void run() 
      { 
       JavaFXTest.this.stage = new Stage(); 
       JavaFXTest.this.stage.setTitle("Hello Java FX"); 
       JavaFXTest.this.stage.setResizable(true); 
       final Group root = new Group(); 
       final Scene scene = new Scene(root, 80, 20); 
       JavaFXTest.this.stage.setScene(scene); 
       // Set up the embedded browser: 
       JavaFXTest.this.browser = new WebView(); 
       JavaFXTest.this.webEngine = JavaFXTest.this.browser.getEngine(); 
       JavaFXTest.this.webEngine.load("http://camendesign.com/code/video_for_everybody/test.html"); 
       final ObservableList<Node> children = root.getChildren(); 
       children.add(JavaFXTest.this.browser); 
       JavaFXTest.this.jfxPanel.setScene(scene); 
      } 
     }); 
    } 
} 
+0

嗯...看到一个黑色的矩形,在窗户上听不到任何声音。即使没有混合摆动/ FX。对于简单的FX,我只是将[教程示例3](http://docs.oracle.com/javafx/2/webview/jfxpub-webview.htm)更改为您的测试网址 – kleopatra

+0

@kleopatra感谢您的信息。不过,我想知道为什么javaFX的行为如此不同。你能告诉我你正在运行哪个javafx版本吗?例如mp4 H.264只支持JavaFX 2.1。我已经安装了JavaFX 2.2 – haferblues

+0

用jdk7u45附带的fx进行了测试(或者几天前更新了u21,并且完全不记得;) – kleopatra

这里是一个半的答案,这可能有助于: 的oracle website指出:“在这个时候,在线安装和Java更新功能并不适用于64位架构”

对我来说,这造成了很多问题,因为Java似乎是最新的,但事实上并非如此。在某些机器上,我可以通过手动更新Java 64位虚拟机来解决实际问题。但是,在Mac上,视频仍然没有播放,只有声音。

64位/ 32位问题变得更糟,因为双击jar可能会在64位JVM中启动它,但通过控制台它将在32位JVM中启动。因此,如果在控制台中执行“java -version”,则输出可能是“1.7.0 u45 32位”,但只要通过双击启动jar,就会在过时的64位JVM中启动。

所以,如果你运行在JavaFX的问题(尤其是UnsatisfiedLinkError),你有一个64位计算机,只需安装最新的64位Java,并希望它解决了这个问题。