【问题标题】:Play a video with vlcj on a Mac在 Mac 上使用 vlcj 播放视频
【发布时间】:2015-11-14 06:37:28
【问题描述】:

您好,我正在尝试在 mac 上使用 vlcj 运行视频。 我尝试了几件事,但到处都有问题。 程序正在启动,但没有视频播放。有谁知道如何在mac上处理vlcj? 我的意图是在带有 java 的 mac 上播放 rtsp 流。我先用 opencv 试过,现在用 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)

【问题讨论】:

    标签: vlc vlcj


    【解决方案1】:

    这是在 JDK 1.6 之后的 OSX 上使用 vlcj(实际上是其他应用程序)的一个众所周知且有据可查的问题。

    我知道仅链接的答案不是最好的,但是关于这个问题的信息太多了,无法在此重复,所以请查看https://github.com/caprica/vlcj/issues/205

    基本上你不能使用嵌入式媒体播放器组件,因为它依赖重量级 AWT 组件(Canvas)来“托管”视频,并且在 JDK 1.7 及更高版本的 OSX 中不再有重量级 AWT。

    所以在 OSX 上要么使用 vlcj 的所谓“直接”渲染方法,要么使用 JDK 1.6。

    【讨论】:

      【解决方案2】:

      谢谢

      这里是一步一步解释的一切 http://capricasoftware.co.uk/#/projects/vlcj/tutorial/direct-rendering

      如果延迟 3 秒没问题,rtsp 流可以正常工作

      【讨论】:

      • 我很确定您可以在创建媒体播放器工厂时通过传递“--sout-rtp-caching 200”之类的内容来减少延迟。我不记得确切的开关了。
      • 感谢工作完美,就像这样:String [] options = {" :live-caching=200"}; mediaPlayerComponent.getMediaPlayer().playMedia(rtspURL, options);
      猜你喜欢
      • 2011-10-16
      • 1970-01-01
      • 2016-02-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多