所以我最近遇到了一个问题。每当我想用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 中等口吃,完美品质,自我渲染
我现在正在以较低的比特率呈现一些视频,看看这是不是问题。