VLCJ EmbeddedMediaPlayerComponent 播放器在准备新视频后仍然显示旧视频图像

VLCJ EmbeddedMediaPlayerComponent player still shows old video image after preparing a new video

下面是我加载视频的方式(实际代码中,变量是播放器的成员变量class)。我不想立即播放视频,这就是我使用 prepareMedia() 的原因。当应用程序准备好播放视频时,我调用 player.play()。

但是,我的播放器视图(我将 EmbeddedMediaPlayerComponent 添加到 JPanel 中,它被设置为 JFrame 的 ContentPane)在 运行 以下代码之后仍然显示带有新 "videoPath" 值的旧视频。播放器视图仅在我调用 player.play() 后显示新视频。

EmbeddedMediaPlayerComponent mediaPlayerComponent = new EmbeddedMediaPlayerComponent();
MediaPlayer player = mediaPlayerComponent.getMediaPlayer();
player.prepareMedia(videoPath);

有什么方法可以让播放器在不开始播放的情况下显示新的视频图像(或至少删除旧的视频图像)?我尝试从 mediaPlayerComponent 调用 repaint() 等方法,从播放器调用 stop() ,在覆盖的 MediaPlayerEventAdpater 方法(例如 mediaFreed() )中,但到目前为止我没有尝试任何工作。

VLC/LibVLC的特点是视频结束时显示最后一帧,所以你得想办法。

一个好的解决方案是使用具有两个视图的 CardLayout,一个用于媒体播放器组件(或用于视频表面的 Canvas),另一个视图仅包含空白(黑色) JPanel.

接下来的想法是收听视频 starting/stopping/finishing 并在卡片布局中显示适当的视图。

如果您添加 MediaPlayerEventListener 并实现播放、停止、完成和错误事件,您应该涵盖所有情况。

例如:在 "playing" 事件中,您切换卡片布局以显示视频视图,在 "stopped"、"finished" 和 "error" 事件中,您切换您的显示空白视图的卡片布局。

视图当然不必是黑色的,你可以做任何你想做的事,比如显示图像。

另请注意,媒体播放器事件不会在 Swing 事件调度线程上传递,因此您需要使用 SwingUtilities#invokeLater 来正确切换视图。