2015-08-20 127 views
0

嗨我試圖讓一個視頻在Mac上使用vlcj運行。 我嘗試了幾件事情,但到處都有錯誤。 Programm正在啓動,但沒有視頻播放。有誰知道如何在Mac上處理vlcj? 我的意圖是用java在mac上播放rtsp流。我先用opencv和現在的vlcj嘗試過,但沒有成功。在Mac上使用vlcj播放視頻

有沒有什麼好的例子,說明如何做到這一點在Mac或有沒有人知道爲什麼它不工作?

感謝

代碼:

import java.awt.event.ActionEvent; 
import java.awt.event.ActionListener; 

import javax.swing.JFrame; 
import javax.swing.SwingUtilities; 
import javax.swing.Timer; 

import uk.co.caprica.vlcj.binding.LibVlc; 
import uk.co.caprica.vlcj.component.EmbeddedMediaPlayerComponent; 
import uk.co.caprica.vlcj.runtime.RuntimeUtil; 

import com.sun.jna.Native; 
import com.sun.jna.NativeLibrary; 

public class VideoExample { 

    private final EmbeddedMediaPlayerComponent mediaPlayerComponent; 

    public static void main(final String[] args) { 


     uk.co.caprica.vlcj.binding.LibC.INSTANCE.setenv("VLC_PLUGIN_PATH", "/Applications/VLC.app/Contents/MacOS/plugins", 1); 

     NativeLibrary.addSearchPath(RuntimeUtil.getLibVlcLibraryName(), "/Applications/VLC.app/Contents/MacOS/lib"); 
     Native.loadLibrary(RuntimeUtil.getLibVlcLibraryName(), LibVlc.class); 
     SwingUtilities.invokeLater(new Runnable() { 
      @Override 
      public void run() { 
       new VideoExample(args); 
      } 
     }); 
    } 

    private VideoExample(String[] args) { 
     JFrame frame = new JFrame("vlcj Tutorial"); 

     mediaPlayerComponent = new EmbeddedMediaPlayerComponent(); 

     frame.setContentPane(mediaPlayerComponent); 

     frame.setLocation(100, 100); 
     frame.setSize(500, 500); 
     frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     frame.setVisible(true); 

     mediaPlayerComponent.getMediaPlayer().playMedia("/test.m4v"); 

    } 
} 

錯誤:

[main] INFO uk.co.caprica.vlcj.Info - vlcj: <version not available> 
[main] INFO uk.co.caprica.vlcj.Info - java: 1.8.0_45 Oracle Corporation 
[main] INFO uk.co.caprica.vlcj.Info - java home: /Library/Java/JavaVirtualMachines/jdk1.8.0_45.jdk/Contents/Home/jre 
[main] INFO uk.co.caprica.vlcj.Info - os: Mac OS X 10.10.4 x86_64 
[AWT-EventQueue-0] INFO uk.co.caprica.vlcj.binding.LibVlcFactory - vlc: 2.2.1 Terry Pratchett (Weatherwax), changeset 2.2.1-0-ga425c42 
[AWT-EventQueue-0] INFO uk.co.caprica.vlcj.binding.LibVlcFactory - libvlc: /Applications/VLC.app/Contents/MacOS/lib/libvlc.dylib 
JavaVM WARNING: JAWT_GetAWT must be called after loading a JVM 
Exception in thread "AWT-EventQueue-0" java.lang.UnsatisfiedLinkError: Can't load JAWT 
    at com.sun.jna.Native.getWindowHandle0(Native Method) 
    at com.sun.jna.Native$AWT.getComponentID(Native.java:1879) 
    at com.sun.jna.Native.getComponentID(Native.java:253) 
    at uk.co.caprica.vlcj.player.embedded.videosurface.CanvasVideoSurface.attach(CanvasVideoSurface.java:76) 
    at uk.co.caprica.vlcj.player.embedded.DefaultEmbeddedMediaPlayer.attachVideoSurface(DefaultEmbeddedMediaPlayer.java:162) 
    at uk.co.caprica.vlcj.player.embedded.DefaultEmbeddedMediaPlayer.onBeforePlay(DefaultEmbeddedMediaPlayer.java:327) 
    at uk.co.caprica.vlcj.player.DefaultMediaPlayer.play(DefaultMediaPlayer.java:804) 
    at uk.co.caprica.vlcj.player.DefaultMediaPlayer.playMedia(DefaultMediaPlayer.java:265) 
    at uk.co.caprica.vlcj.player.DefaultMediaPlayer.playMedia(DefaultMediaPlayer.java:256) 
    at VideoExample.<init>(VideoExample.java:46) 
    at VideoExample.<init>(VideoExample.java:34) 
    at VideoExample$1.run(VideoExample.java:29) 
    at java.awt.event.InvocationEvent.dispatch(InvocationEvent.java:311) 
    at java.awt.EventQueue.dispatchEventImpl(EventQueue.java:756) 
    at java.awt.EventQueue.access$500(EventQueue.java:97) 
    at java.awt.EventQueue$3.run(EventQueue.java:709) 
    at java.awt.EventQueue$3.run(EventQueue.java:703) 
    at java.security.AccessController.doPrivileged(Native Method) 
    at java.security.ProtectionDomain$1.doIntersectionPrivilege(ProtectionDomain.java:75) 
    at java.awt.EventQueue.dispatchEvent(EventQueue.java:726) 
    at java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:201) 
    at java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:116) 
    at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:105) 
    at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:101) 
    at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:93) 
    at java.awt.EventDispatchThread.run(EventDispatchThread.java:82) 

回答

0

感謝

這裏是解釋一切按部就班 http://capricasoftware.co.uk/#/projects/vlcj/tutorial/direct-rendering

如果您沒有問題3秒RTSP流的工作完全沒有延遲

+0

我敢肯定,你可以通過減少延遲在創建媒體播放器工廠時傳遞類似「--sout-rtp-caching 200」的內容。我不記得確切的開關。 – caprica

+0

謝謝你的工作是這樣的:'String [] options = {「:live-caching = 200」}; mediaPlayerComponent.getMediaPlayer()。playMedia(rtspURL,options);' – user3077796

2

這是衆所周知的,證據充分的問題與vlcj(事實上其他應用程序)上OSX與一個比1.6更早的JDK。

我只知道鏈接的答案是不是最好的,但有這個問題了太多的信息在這裏重複,所以檢查https://github.com/caprica/vlcj/issues/205

實質上,您不能使用嵌入式媒體播放器組件,因爲它依賴於重量級AWT組件(Canvas)「託管」視頻,而在JDK 1.7及更高版本的OSX中,不再有重量級AWT。因此,在OSX

或者使用所謂的「直接」渲染的方式與vlcj,或使用JDK 1.6。