2014-09-10 6 views
1

나는 VLCJ Bindings와 협력하여 마침내 몇 가지 장애물을 얻을 수있었습니다. 이제 나는 여기있다. 나는 시각적 인 미디어 플레이어 구성 요소 (EmbeddedMediaPlayerComponent)가 필요하지 않으며 (현재로서는) 필요도없고 원하는 것도 없습니다. 필요한 것은 (현재는) 오디오 파일을 재생하는 것입니다.Displayable Component없이 Java로 VLC Media Player를 얻으려면 어떻게해야합니까?

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

당신은 동작을 사용자 정의하고 쉽게 이벤트 핸들러를 구현하는 예를 들어, 서브 클래스 수 있습니다.

소위 "구성 요소"미디어 플레이어를 사용하면 MediaPlayerFactory을 통해 생성 된 비 구성 요소 미디어 플레이어를 사용하는 것보다 약간 더 좋거나/더 쉬운 API를 얻을 수 있습니다.

미디어가 오디오 파일 인 경우 제대로 작동합니다.

미디어가 실제로 비디오이지만 오디오 트랙 만 재생하려는 경우 AudioMediaPlayerComponent을 기본적으로 사용하더라도 VLC는 비디오 창을 엽니 다. 이 경우에도 여전히 비디오 출력을 비활성화해야합니다. VLC에 vcodec=dummy을 사용하도록 알리는 것이 가장 간단한 방법입니다.

저는 창을 만들고 화면을 벗어나거나 1x1 크기로 만드는 것과 같은 속임수에 정말로 동의하지 않습니다. 꼭 필요한 것은 아닙니다.

원래 질문에 게시 된 코드에는 관련없는 문제가 있습니다. Play() 메서드가 종료되면 EMPCEMP 변수가 범위를 벗어나 미디어 플레이어가 가비지 수집 대상이됩니다. 어떤 일이 일어날지는 vlcj가 사용하는 기본 훅 (hook)이 더 이상 존재하지 않는 Java 객체를 다시 호출하기 때문에 나중에 임의의 시간에 애플리케이션이 충돌 할 가능성이 있습니다. 하드 참조를 통해 미디어 플레이어 참조를 유지해야합니다.

+0

간단한 AudioMediaPlayerComponent를 만드는 방법은 무엇입니까? – Will

+0

답변을 업데이트했습니다. – caprica

+0

감사합니다.내 최종 결과를 얻기 위해 소스에서 따라온 코드가 약간 복잡하기 때문에 궁금했습니다. – Will

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