我正在使用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
我理解。这说得通。但我不需要它可见。我只需要声音。我怎样才能做到这一点?
答案 0 :(得分:2)
EmbeddedMediaPlayer
仅适用于您希望在应用程序中嵌入视频表面的情况。
如果您只需要音频,那么AudioMediaPlayerComponent
就是明确的目的。
要创建这样的组件,只需:
AudioMediaPlayerComponent audioMediaPlayerComponent =
new AudioMediaPlayerComponent();
您可以对其进行子类化,例如自定义行为并轻松实现事件处理程序。
使用所谓的“组件”媒体播放器为您提供比使用MediaPlayerFactory
创建的非“组件”媒体播放器更好/更容易的API。
如果您的媒体是音频文件,则此功能正常。
如果您的媒体实际上是视频,但您只想播放音轨,那么即使您默认使用AudioMediaPlayerComponent
,VLC也会打开视频窗口。在这种情况下,您仍然需要实际禁用视频输出 - 最简单的方法是告诉VLC使用vcodec=dummy
。
我真的不同意创建窗口并将其移出屏幕或将其调整为1x1等技巧,但这并不是必需的。
在原始问题中发布的代码中存在无关的问题。当EMPC
方法终止时,EMP
和Play()
变量将超出范围,使媒体播放器有资格进行垃圾回收。随之而来的是,随着时间的推移,您的应用程序可能会崩溃,因为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();
}
}