2014-09-10 8 views
1

Я работаю с VLCJ Bindings и, наконец, смог получить несколько блокпостов. Теперь я здесь. У меня нет необходимости (на данный момент) или желания для видимого компонента Media Player (EmbeddedMediaPlayerComponent). Все, что мне нужно (пока), - это воспроизведение аудиофайлов. У меня есть следующий метод в месте, чтобы справиться с этим для меня:Как получить медиаплеер VLC на Java без отображаемого компонента?

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 

Что я понимаю. Это имеет смысл. Но мне это НЕ НУЖНО. Мне просто нужен звук. Как я могу это сделать?

+1

В этом контексте вы ДОЛЖНЫ отображать окно, у вас нет выбора. Создайте небольшое окно, переместите его где-нибудь за пределы экрана, сделайте его видимым. Возможно, вы даже сможете сделать его невидимым, если вы его не распоряжаетесь – MadProgrammer

+0

Хорошо, я понял. Во всяком случае, я нашел ответ, который сработал для меня. Я не хочу использовать EmbeddedMediaPlayerComponent, когда EmbeddedMediaPlayer работает просто отлично, мне нужно только выяснить, как его создать, и теперь у меня есть. – Will

ответ

2

EmbeddedMediaPlayer только для случая, когда вы хотите, чтобы в буквальном смысле вставлять видео поверхность внутри приложения.

Если вам просто нужен звук, для этой цели есть AudioMediaPlayerComponent.

Чтобы создать такой компонент, просто:

AudioMediaPlayerComponent audioMediaPlayerComponent = 
    new AudioMediaPlayerComponent(); 

Вы можете унаследовать его, например, чтобы настроить поведение и легко реализовать обработчики событий.

Использование так называемых «компонентных» медиаплееров дает вам немного более удобный/простой API, чем использование некомпонентных медиаплееров, созданных с помощью MediaPlayerFactory.

Это прекрасно работает, если ваши медиафайлы являются аудиофайлами.

Если ваш носитель фактически является видео, но вы хотите только воспроизвести звуковую дорожку, то даже если вы используете AudioMediaPlayerComponent по умолчанию, VLC откроет видеоокно. В этом случае вам по-прежнему необходимо отключить видеовыход - самый простой способ сделать это - сообщить VLC об использовании vcodec=dummy.

Я действительно не согласен с трюками, такими как создание окна и перемещение его за пределы экрана или его размер до 1x1, это просто не обязательно.

В коде, отправленном в исходном вопросе, есть проблема, которая не связана. Переменная EMPC и EMP выйдет за пределы области действия, когда метод Play() завершается, что делает медиаплеер пригодным для сбора мусора. Что произойдет, так это то, что некоторое случайное время позже ваше приложение, скорее всего, потерпит крах, потому что собственные перехватчики, используемые vlcj, перейдут обратно в объект Java, который больше не существует. Вам нужно поддерживать ссылки на медиаплеерах через жесткие ссылки.

+0

Как мне создать простой компонент AudioMediaPlayerComponent? – Will

+0

Я обновил ответ. – caprica

+0

Хорошо спасибо.Я задавался вопросом, потому что код, который я использовал в исходнике для достижения моего конечного результата, был немного ... вовлечен. – Will

0

Хорошо так получается, вы можете создать свой собственный объект MediaPlayer за пределами EmbeddedMediaPlayerComponent так:

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(); 
    } 
}