我正在使用 VLCJ 绑定(bind),并最终克服了一些障碍。现在我在这里。 我(此时)不需要,也不渴望可见的媒体播放器组件(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 之类的技巧,这是没有必要的。
在原始问题中发布的代码中存在一个不相关的问题。当 Play()
方法终止时,EMPC
和 EMP
变量将超出范围,从而使媒体播放器符合垃圾回收的条件。将会发生的情况是,一段随机时间后,您的应用程序可能会崩溃,因为 vlcj 使用的 native Hook 将回调到不再存在的 Java 对象。您需要通过硬引用使媒体播放器引用保持 Activity 状态。
关于java - 如何在没有可显示组件的情况下使用 Java 获得 VLC 媒体播放器?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25756172/