有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

javafx如何在没有可显示组件的情况下获得Java中的VLC媒体播放器?

我正在与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

我明白。这是有道理的。但我不需要它可见。我只需要声音。我怎样才能做到这一点


共 (2) 个答案

  1. # 1 楼答案

    EmbeddedMediaPlayer仅适用于希望在应用程序中嵌入视频表面的情况

    如果您只需要音频,那么有一个AudioMediaPlayerComponent专门用于此目的

    要创建这样的组件,只需执行以下操作:

    AudioMediaPlayerComponent audioMediaPlayerComponent = 
        new AudioMediaPlayerComponent();
    

    您可以将其子类化,例如定制行为并轻松实现事件处理程序

    与使用通过MediaPlayerFactory创建的非“组件”媒体播放器相比,使用所谓的“组件”媒体播放器提供了一个稍微更好/更简单的API

    如果您的媒体是音频文件,则此功能可以正常工作

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

    我真的不同意一些技巧,比如创建一个窗口并将其移出屏幕,或者将其缩小到1x1,这只是没有必要的

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

  2. # 2 楼答案

    好的,那么您可以在EmbeddedMediaPlayerComponent之外创建自己的MediaPlayer对象,如下所示:

    public static void Play(File AudioFile){
        if (!LibVLCLoader.Loaded) LibVLCLoader.loadLibVLC();
        MediaPlayerFactory MPF = new MediaPlayerFactory(
            " video-title=vlcj video output",
            " no-snapshot-preview",
            " quiet",
            " quiet-synchro",
            " sub-filter=logo:marq",
            " intf=dummy"
        );
        EmbeddedMediaPlayer EMP = MPF.newEmbeddedMediaPlayer();
        if (EMP.prepareMedia(AudioFile.getAbsolutePath())){
            EMP.addMediaPlayerEventListener(new MediaPlayerEventAdapter(){
                @Override public void subItemFinished(MediaPlayer p, int i){
                    EMP.release();
                    MPF.release();
                }
            });
            Platform.runLater(() -> EMP.play());
        } else{
            EMP.release();
            MPF.release();
        }
    }