我正在使用VLCJ绑定,并且终于能够获得一些障碍。现在我在这里。
(现在)我不需要可见的媒体播放器组件(EmbeddedMediaPlayerComponent)。我现在需要的只是播放音频文件。
我采用以下方法来为我处理:

public static void Play(File AudioFile){
    if (!LibVLCLoader.Loaded) LibVLCLoader.loadLibVLC();
    EmbeddedMediaPlayerComponent EMPC = new EmbeddedMediaPlayerComponent();
    if (EMPC.getMediaPlayer().prepareMedia(AudioFile.getAbsolutePath())){
        EMPC.getMediaPlayer().addMediaPlayerEventListener(new MediaPlayerEventAdapter(){
            @Override public void subItemFinished(MediaPlayer p, int i){
                EMPC.release(true);
            }
        });
        Platform.runLater(() -> EMPC.getMediaPlayer().play());
    }
}


但是我不断收到这个异常:

Exception in thread "JavaFX Application Thread" java.lang.IllegalStateException: The video surface component must be displayable


我了解。这说得通。但是我不需要它可见。我只需要声音。我该如何实现?

最佳答案

EmbeddedMediaPlayer仅用于您要在应用程序中实际嵌入视频界面的情况。

如果您只需要音频,可以使用AudioMediaPlayerComponent明确地达到此目的。

要创建这样的组件,只需:

AudioMediaPlayerComponent audioMediaPlayerComponent =
    new AudioMediaPlayerComponent();


您可以对其进行子类化,例如自定义行为并轻松实现事件处理程序。

与使用通过MediaPlayerFactory创建的非“组件”媒体播放器相比,使用所谓的“组件”媒体播放器为您提供了更好/更轻松的API。

如果您的媒体是音频文件,则此方法效果很好。

如果您的媒体实际上是视频,但是您只想播放音轨,那么即使默认情况下使用AudioMediaPlayerComponent,VLC也会打开一个视频窗口。在这种情况下,您实际上仍然需要禁用视频输出-最简单的方法是告诉VLC使用vcodec=dummy

我真的不同意诸如创建窗口并将其移出屏幕或将其缩小为1x1之类的技巧,但这不是必需的。

在原始问题中发布的代码中,存在一个不相关的问题。当EMPC方法终止时,EMPPlay()变量将超出范围,使媒体播放器有资格进行垃圾回收。将会发生的情况是,在某个随机时间之后,您的应用程序可能会崩溃,因为vlcj使用的本机挂钩将回调到不再存在的Java对象中。您需要通过硬引用使媒体播放器引用保持活动状态。

10-07 19:42
查看更多