gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 03:45:43 25 4
gpt4 key购买 nike

我正在使用 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() 方法终止时,EMPCEMP 变量将超出范围,从而使媒体播放器符合垃圾回收的条件。将会发生的情况是,一段随机时间后,您的应用程序可能会崩溃,因为 vlcj 使用的 native Hook 将回调到不再存在的 Java 对象。您需要通过硬引用使媒体播放器引用保持 Activity 状态。

关于java - 如何在没有可显示组件的情况下使用 Java 获得 VLC 媒体播放器?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25756172/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com