当前位置: 首页 > 知识库问答 >
问题:

JavaFX视频未播放

公良凯
2023-03-14

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

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

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

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

编辑:更新了我的代码后,评论的珠海,什么都没有改变,黑匣子仍然出现没有内容播放,控制台不显示任何文本出来

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

共有3个答案

逄边浩
2023-03-14

试试这个,它对我有用:

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;

    }
}

帕特里克

何向荣
2023-03-14

请不要介意我写这个答案。我知道这是一个非常古老的问题,但这个答案可能会帮助其他人。我目前正在html" target="_blank">开发一个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实例化media aView,则不要再次实例化它。再次实例化它可能会使media aView失去对原始节点的引用。参考这篇文章和回答由itachi, javafx媒体查看只有音频正在播放

云景焕
2023-03-14

因此,我安装了windows media功能包,以使adobe premiere pro正常工作(因为它需要windows media player提供的dll文件(我没有安装该文件,因为我运行的是N版本的windows),现在视频确实为我播放。

我不能100%确认原因是没有安装WMP,因为媒体功能包也可能安装了解决我问题的其他东西,尽管如此,问题还是解决了:)

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

 类似资料:
  • 问题内容: 我遵循了一些有关结合JavaFX与Swing(JFrame)来播放视频的教程,但是我得到的只是一个黑屏,该视频应该没有任何实际的内容播放,也没有报错。 我在这里做错什么,为什么不播放视频? 我尝试了几个.flv视频,但都不会开始播放(当我在浏览器中打开它们时,它们会播放) 我在装有K-lite完整编解码器包的Windows 8.1 N Pro上运行jre7和jdk1.7.0_45 编辑

  • 我在JavaFx媒体中显示视频有问题: 我知道代码没有错,因为在我的同事系统中它显示了。我尝试显示flv文件。我看到问题:JavaFX视频没有播放 我有视窗10 N与K-Lite标准编解码器和jdk-8u65-windows-x64Java我安装了功能包为视窗10像上面的链接。我不知道会有什么问题。

  • RTSP视频可以在Android MediaPlayer中播放吗?如果是,怎么做?我得到的服务器死亡错误(100,0)这是我的编码部分包com的错误。实例样本媒体; 这是我的Logcat结果,我得到的结果是07-09 12:17:05.484:E/MediaPlayer(3990):error(1,-2147483648)07-09 12:17:05.484:W/System。err(3990):

  • 用 AVPlayer 类写的简易视频播放器,可以播放来自互联网的视频,支持手势缩放视频。只能播放iPhone支持的视频格式。 目前有两点不足:一是无法调节音量;二是手势放大缩小之后滑动快进快退也不太正常。希望有其他开发者在此基础上继续改进。 [Code4App.com]

  • 主要内容:HTML视频(Videos)播放,实例,问题以及解决方法,使用 <embed> 标签,实例,使用 <object> 标签,实例,使用 HTML5 <video> 元素,实例,最好的 HTML 解决方法,HTML 5 + <object> + <embed>,使用超链接,实例,关于内联视频的说明,HTML 多媒体标签在 HTML 中播放视频的方法有很多种。 HTML视频(Videos)播放 实例 <video width="320" height="240" controls> <sou