VLCJ 如何在不播放的情况下准备媒体?
VLCJ How to prepare media without playing it?
我使用 embeddedMediaPlayer.media().play(path);
加载视频并同时播放它没有问题,但我宁愿它打开并且没有自动播放视频。如果我使用 embeddedMediaPlayer.media().prepare(path);
它似乎并没有真正做任何事情,因为如果我然后使用 embeddedMediaPlayer.controls().play();
播放视频它不会启动视频..
我还需要做些什么才能正确加载视频吗?使用 embeddedMediaPlayer.media().play(path);
我在终端中得到这个显示视频已完全加载:
[00007fd615b78b00] videotoolbox decoder: Using Video Toolbox to decode 'h264'
[00007fd615b78b00] videotoolbox decoder: vt cvpx chroma: 420v
但是 embeddedMediaPlayer.media().prepare(path);
我不明白。看起来它实际上并不是 'preparing' 视频,尽管函数的名称具有这种效果。
编辑:使用的代码来自演示程序https://github.com/caprica/vlcj-javafx-demo
public class VlcjJavaFxApplication 扩展应用程序 {
private final MediaPlayerFactory mediaPlayerFactory;
private final EmbeddedMediaPlayer embeddedMediaPlayer;
private ImageView videoImageView;
public VlcjJavaFxApplication() {
this.mediaPlayerFactory = new MediaPlayerFactory();
this.embeddedMediaPlayer = mediaPlayerFactory.mediaPlayers().newEmbeddedMediaPlayer();
this.embeddedMediaPlayer.events().addMediaPlayerEventListener(new MediaPlayerEventAdapter() {
@Override
public void playing(MediaPlayer mediaPlayer) {
}
@Override
public void paused(MediaPlayer mediaPlayer) {
}
@Override
public void stopped(MediaPlayer mediaPlayer) {
}
@Override
public void timeChanged(MediaPlayer mediaPlayer, long newTime) {
}
@Override
public void mediaChanged(MediaPlayer mediaPlayer, MediaRef media) {
System.out.println("media changed");
}
});
}
@Override
public void init() {
this.videoImageView = new ImageView();
this.videoImageView.setPreserveRatio(true);
embeddedMediaPlayer.videoSurface().set(videoSurfaceForImageView(this.videoImageView));
}
@Override
public final void start(Stage primaryStage) throws Exception {
List<String> params = getParameters().getRaw();
// if (params.size() != 1) {
// System.out.println("Specify a single MRL");
// System.exit(-1);
// }
BorderPane root = new BorderPane();
root.setStyle("-fx-background-color: black;");
videoImageView.fitWidthProperty().bind(root.widthProperty());
videoImageView.fitHeightProperty().bind(root.heightProperty());
root.widthProperty().addListener((observableValue, oldValue, newValue) -> {
// If you need to know about resizes
});
root.heightProperty().addListener((observableValue, oldValue, newValue) -> {
// If you need to know about resizes
});
root.setCenter(videoImageView);
Scene scene = new Scene(root, 1200, 675, Color.BLACK);
primaryStage.setTitle("vlcj JavaFX");
primaryStage.setScene(scene);
primaryStage.show();
scene.setOnKeyPressed(new EventHandler<KeyEvent>() {
public void handle(KeyEvent ke) {
if (ke.getCode().toString() == "ESCAPE")
System.exit(0);
else if (ke.getCode().toString() == "SLASH")
playPause();
}
});
embeddedMediaPlayer.media()
.prepare("/Volumes/Movies/stuff/projects/JavaFX/test/src/assets/test.mp4");
// embeddedMediaPlayer.media()
// .play("/Volumes/Movies/stuff/projects/JavaFX/test/src/assets/test.mp4");//this plays fine
// embeddedMediaPlayer.media().play(params.get(0));
embeddedMediaPlayer.controls().setPosition(0.4f);
}
private void playPause() {
System.out.println(embeddedMediaPlayer.status().isPlayable());//prepare - false, play = true
embeddedMediaPlayer.controls().play();
}
这似乎是一个实际问题,或者 prepare
方法不应该像这样工作。至少我在开发的 github 页面上发布了这个问题,它已经开放了几天,没有任何人回应。
https://github.com/caprica/vlcj/issues/1094
vlcj 演示项目设置为自动播放视频,我猜是这样,因为这是唯一的方法。 prepare
方法似乎准备了一个视频,但您必须等待...或按一次播放以加载它,然后再次播放它。我想这有点像 'half prepared'.
编辑:作者直接从 github 中删除了问题,没有解决方案。很奇怪。作者似乎没明白问题是播放延迟,而不是播放失败。在问题被删除之前,作者有这样的声明似乎可以解释延迟:
“理论上,您应该在准备之后和调用播放之前等待 mediaChanged 事件,因为 LibVLC 最近合理地使设置媒体异步。”
即时播放有一个解决方法,即使用 start
方法并在首次打开或媒体更改时暂停。这样视频就可以立即播放了。
我使用 embeddedMediaPlayer.media().play(path);
加载视频并同时播放它没有问题,但我宁愿它打开并且没有自动播放视频。如果我使用 embeddedMediaPlayer.media().prepare(path);
它似乎并没有真正做任何事情,因为如果我然后使用 embeddedMediaPlayer.controls().play();
播放视频它不会启动视频..
我还需要做些什么才能正确加载视频吗?使用 embeddedMediaPlayer.media().play(path);
我在终端中得到这个显示视频已完全加载:
[00007fd615b78b00] videotoolbox decoder: Using Video Toolbox to decode 'h264'
[00007fd615b78b00] videotoolbox decoder: vt cvpx chroma: 420v
但是 embeddedMediaPlayer.media().prepare(path);
我不明白。看起来它实际上并不是 'preparing' 视频,尽管函数的名称具有这种效果。
编辑:使用的代码来自演示程序https://github.com/caprica/vlcj-javafx-demo
public class VlcjJavaFxApplication 扩展应用程序 {
private final MediaPlayerFactory mediaPlayerFactory;
private final EmbeddedMediaPlayer embeddedMediaPlayer;
private ImageView videoImageView;
public VlcjJavaFxApplication() {
this.mediaPlayerFactory = new MediaPlayerFactory();
this.embeddedMediaPlayer = mediaPlayerFactory.mediaPlayers().newEmbeddedMediaPlayer();
this.embeddedMediaPlayer.events().addMediaPlayerEventListener(new MediaPlayerEventAdapter() {
@Override
public void playing(MediaPlayer mediaPlayer) {
}
@Override
public void paused(MediaPlayer mediaPlayer) {
}
@Override
public void stopped(MediaPlayer mediaPlayer) {
}
@Override
public void timeChanged(MediaPlayer mediaPlayer, long newTime) {
}
@Override
public void mediaChanged(MediaPlayer mediaPlayer, MediaRef media) {
System.out.println("media changed");
}
});
}
@Override
public void init() {
this.videoImageView = new ImageView();
this.videoImageView.setPreserveRatio(true);
embeddedMediaPlayer.videoSurface().set(videoSurfaceForImageView(this.videoImageView));
}
@Override
public final void start(Stage primaryStage) throws Exception {
List<String> params = getParameters().getRaw();
// if (params.size() != 1) {
// System.out.println("Specify a single MRL");
// System.exit(-1);
// }
BorderPane root = new BorderPane();
root.setStyle("-fx-background-color: black;");
videoImageView.fitWidthProperty().bind(root.widthProperty());
videoImageView.fitHeightProperty().bind(root.heightProperty());
root.widthProperty().addListener((observableValue, oldValue, newValue) -> {
// If you need to know about resizes
});
root.heightProperty().addListener((observableValue, oldValue, newValue) -> {
// If you need to know about resizes
});
root.setCenter(videoImageView);
Scene scene = new Scene(root, 1200, 675, Color.BLACK);
primaryStage.setTitle("vlcj JavaFX");
primaryStage.setScene(scene);
primaryStage.show();
scene.setOnKeyPressed(new EventHandler<KeyEvent>() {
public void handle(KeyEvent ke) {
if (ke.getCode().toString() == "ESCAPE")
System.exit(0);
else if (ke.getCode().toString() == "SLASH")
playPause();
}
});
embeddedMediaPlayer.media()
.prepare("/Volumes/Movies/stuff/projects/JavaFX/test/src/assets/test.mp4");
// embeddedMediaPlayer.media()
// .play("/Volumes/Movies/stuff/projects/JavaFX/test/src/assets/test.mp4");//this plays fine
// embeddedMediaPlayer.media().play(params.get(0));
embeddedMediaPlayer.controls().setPosition(0.4f);
}
private void playPause() {
System.out.println(embeddedMediaPlayer.status().isPlayable());//prepare - false, play = true
embeddedMediaPlayer.controls().play();
}
这似乎是一个实际问题,或者 prepare
方法不应该像这样工作。至少我在开发的 github 页面上发布了这个问题,它已经开放了几天,没有任何人回应。
https://github.com/caprica/vlcj/issues/1094
vlcj 演示项目设置为自动播放视频,我猜是这样,因为这是唯一的方法。 prepare
方法似乎准备了一个视频,但您必须等待...或按一次播放以加载它,然后再次播放它。我想这有点像 'half prepared'.
编辑:作者直接从 github 中删除了问题,没有解决方案。很奇怪。作者似乎没明白问题是播放延迟,而不是播放失败。在问题被删除之前,作者有这样的声明似乎可以解释延迟:
“理论上,您应该在准备之后和调用播放之前等待 mediaChanged 事件,因为 LibVLC 最近合理地使设置媒体异步。”
即时播放有一个解决方法,即使用 start
方法并在首次打开或媒体更改时暂停。这样视频就可以立即播放了。