如何在没有可显示组件的情况下使用Java获取VLC媒体播放器?

时间:2014-09-10 01:53:22

标签: java javafx vlc audio-player vlcj

我正在使用VLCJ Bindings并最终能够获得多个障碍。现在我在这里。 我不需要(此时),也不需要可见的Media Player组件(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 个答案:

答案 0 :(得分:2)

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

如果您只需要音频,那么AudioMediaPlayerComponent就是明确的目的。

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

AudioMediaPlayerComponent audioMediaPlayerComponent = 
    new AudioMediaPlayerComponent();

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

使用所谓的“组件”媒体播放器为您提供比使用MediaPlayerFactory创建的非“组件”媒体播放器更好/更容易的API。

如果您的媒体是音频文件,则此功能正常。

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

我真的不同意创建窗口并将其移出屏幕或将其调整为1x1等技巧,但这并不是必需的。

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

答案 1 :(得分:0)

好的,事实证明你可以在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();
    }
}