JavaFX Video Stutter(MediaView)

时间:2016-09-24 15:02:02

标签: java video javafx video-player

所以我最近遇到了一个问题。每当我想用JavaFX MediaPlayer和MediaView一起播放视频时,视频似乎都会在整个地方口吃。我尝试了不同类型的视频文件(我将大部分视频文件自动渲染为.mp4,采用h264编码),帧速率范围为30fps至60fps,比特率为14.000.000至28.000.000 bps。

大多数我自己没有渲染的文件也会出现延迟,所以我很确定我的渲染没有任何问题。

修改的 进一步的测试证实,我自己渲染了视频文件无关紧要。

你们知道为什么会出现这种视频影像以及如何修复它吗?我对任何类型的修复都持开放态度,包括使用不同的方式显示除了通过JavaFX之外的视频文件。以下是视频播放器的主要代码:

public class VideoPlayer extends JPanel implements Checkable
{
    private MediaView view;
    public JFXPanel pane;
    private String path;
    public MediaPlayer player;
    private Dimension size;
    public VideoPlayer(String path, Dimension size)
    {
        this.size = size;
        this.path = path;
        pane = new  JFXPanel();
        player = new MediaPlayer(new Media(path));

        Platform.runLater(new Runnable() {
             @Override
             public void run() {
                 initFX(pane);
             }
         });
        pane.setPreferredSize(size);
        pane.setSize(size);
        pane.setLocation(0,0);
        add(pane);

    }

    public void initFX(JFXPanel fxPanel) {
        Scene scene = createScene();

        pane.setScene(scene);
    }

    private Scene createScene()
    {
       view = new MediaView();
       view.setMediaPlayer(player);
       Group root = new Group();
       view.setPreserveRatio(true);
       view.setFitWidth(size.width);
       view.setSmooth(false);
       root.getChildren().add(view);
       Scene scene = null;

       try{
            scene = new Scene(root, size.width, size.height)
       ;}catch(Exception e){System.out.println(e);}
        return scene;
    }

    public void play()
    {
        player.play();
    }
}

这里,视频播放器接收带有视频文件路径的字符串,尺寸大小是播放器应该的大小。

该类本身扩展了JPanel,以便可以将其添加到JFrame中。这个JPanel包含一个JFXPanel,它依次包含MediaView。

如果你们可以搞清楚为什么视频会变得口吃,那就太棒了。我对所有解决方案持开放态度!

提前感谢您的帮助!

编辑 正如@AlmasB所建议的那样,我制作了一个纯粹的JavaFX应用程序来播放完全相同的文件。它可能会减少一定量的口吃,但可能根本没有。很难看出它是好还是不好。这是简单的JavaFX视频播放器的代码:

public class VideoPlayerTest extends Application {
    static MediaView view;
    static MediaPlayer player;
    @Override
    public void start(Stage primaryStage) {
        Button btn = new Button();
        btn.setText("Say 'Hello World'");
        btn.setOnAction(new EventHandler<ActionEvent>() {

            @Override
            public void handle(ActionEvent event) {
                System.out.println("Hello World!");
            }
        });

        StackPane root = new StackPane();
        //root.getChildren().add(btn);
        makeMediaView();
        root.getChildren().add(view);
        player.play();


        Scene scene = new Scene(root, 1920, 1080);

        primaryStage.setTitle("Hello World!");
        primaryStage.setScene(scene);
        primaryStage.show();

    }

    private static void makeMediaView(){
        player = new MediaPlayer(new Media("file:///C:/Users/wesse/Documents/CowLite%20GabenQuest/resources/cutscenes/gabenquestepisode1intro.mp4.old"));
        view = new MediaView(player);
        view.setPreserveRatio(true);
        view.setFitWidth(1920);
    }

    public static void main(String[] args) {
        launch(args);
    }

}

正如@AlmasB所建议的一些信息:

系统信息

Windows 10

最新JDK版本(1.8)

gtx960,intel i5 3470,8gb RAM

视频测试

1080p 60fps 28mbit / s stutter

1080p 30fps 14mbit / s stutter

720p 29fps 1.8mbit / s 没有口吃,但由于比特率/分辨率低,从YT下载

,因此视频质量较差

1080p 60fps 5.3mbit / s 非常轻微的口吃,视频质量不错,从YT下载

1080p 60fps 6.3mbit / s 中等口吃,完美品质,自我渲染

我现在正在以较低的比特率呈现一些视频,看看这是不是问题。

0 个答案:

没有答案