当前位置: 首页 > 面试题库 >

Xuggle和Java库路径

晋涛
2023-03-14
问题内容

我正在用Java编写截屏应用程序。我决定使用Xuggle进行操作,并且按照xuggle Wiki上的安装说明进行操作。

我使用%XUGGLE_HOME%\ bin和%XUGGLE_HOME%\ lib设置了PATH环境。一切似乎都还可以。我将此应用程序作为RCP插件。我在“
RCP-mail”模板上进行了尝试,插件正常工作,并且视频生成正确。

但是,当我决定在“真实”应用程序上使用它时,该插件崩溃并显示一条奇怪的错误消息:

开始捕获

2011-11-10 08:08:45,438 [Thread-5]警告com.xuggle.ferry.JNILibraryLoader-
故障:库的库加载:xuggle-xuggler; 版本:3:绝对路径:C:\ Program Files(x86)\ Xuggle \ bin \
libxuggle-xuggler-3.dll; 错误:java.lang.UnsatisfiedLinkError:C:\ Program
Files(x86)\ Xuggle \ bin \ libxuggle-xuggler-3.dll:找不到依赖的库

2011-11-10 08:08:45,447 [Thread-5]警告com.xuggle.ferry.JNILibraryLoader-
错误:库的库加载:xuggle-xuggler; 版本:3:绝对路径:C:\ Program Files(x86)\ Xuggle \ bin \
libxuggle-xuggler-3.dll; 错误:java.lang.UnsatisfiedLinkError:C:\ Program
Files(x86)\ Xuggle \ bin \ libxuggle-xuggler-3.dll:找不到依赖的库

2011-11-10 08:08:45,453 [Thread-5] com.xuggle.ferry.JNILibraryLoader错误-
无法加载库:xuggle-xuggler; 版本:3;
请访问http://www.xuggle.com/xuggler/faq/以找到针对该问题的常见解决方案

但这很奇怪,因为java.library.path定义明确:

logger.info(System.getProperty("java.library.path"));

退货

Nov 10, 2011 8:08:45 AM com.gvs.tools.ui.record.video.handler.RecordHandler startRecording
INFO: C:\Program Files (x86)\Java\jre6\bin;C:\Windows\Sun\Java\bin;C:\Windows\system32;C:\Windows;C:/Program Files (x86)/Java/jre6/bin/client;C:/Program Files (x86)/Java/jre6/bin;C:/Program Files (x86)/Java/jre6/lib/i386;C:\Program Files (x86)\Xuggle\bin;C:\Program Files (x86)\Xuggle\lib;C:\Program Files (x86)\NVIDIA Corporation\PhysX\Common;C:\Windows\system32;C:\Windows;C:\Windows\System32\Wbem;C:\Windows\System32\WindowsPowerShell\v1.0\;C:\Program Files (x86)\JProbe 8.3\bin;C:\Program Files\TortoiseSVN\bin;D:\Work\Paul\eclipse;;.

使该插件与该应用程序一起使用时我缺少什么?该问题是由于应用程序使用其他本机库(例如3D-dll)导致的吗?

这是用于制作截屏视频的代码:

RecordHandler.java:
    private void startRecording() {

    Logger logger = Logger.getLogger(RecordHandler.class.getName());
    logger.info(System.getProperty("java.library.path"));

    // Initialize framesQueue
    framesQueue =  new LinkedBlockingQueue<BufferedImage>();
    // Initialize the capture thread
    captureThread =  new ScreenCapturer();
    captureThread.setCaptureFramesQueue(framesQueue);

    // Initialize the recorder
    encoderThread = new FrameEncoder("test.mp4");
    encoderThread.setCapturedFramesQueue(framesQueue);

    // Start capture
    captureThread.start();
    // wait for the Queue to be feed before encoding
    try {
        Thread.sleep(1000L);
    } catch (InterruptedException e) {
    }
    encoderThread.start();
}

ScreenCapturer.java:

    @Override
public void run() {
    // Retrieve the application main window's shell
    Display.getDefault().asyncExec(new Runnable() {

        @Override
        public void run() {
            appShell = Display.getCurrent().getActiveShell();
        }
    });

    isRunning = true;
    System.out.println("Starting Capture");
    for (numberOfFramesTaken = 0; isRunning && numberOfFramesTaken <= IVideoEncoderConfiguration.MAXIMUM_NUMBER_OF_FRAMES; numberOfFramesTaken++) {
        try {
            takeScreenShot();
            Thread.sleep(IVideoEncoderConfiguration.CAPTURE_TIME_INTERVAL_MILLIS);
        } catch (InterruptedException e) {
        }
    }
    System.out.println("Capture has ended");
    System.out.println("Number of frames taken: "
            + numberOfFramesTaken);
}

/**
 * Take a screen capture and store it in the capturedFramesQueue
 */
private void takeScreenShot() {
    Display.getDefault().asyncExec(new Runnable() {
        @Override
        public void run() {
            if (appShell != null) {
                Rectangle bounds = appShell.getBounds();
                java.awt.Rectangle awtBounds =  new java.awt.Rectangle(bounds.x, bounds.y, bounds.width, bounds.height);
                final BufferedImage screenCapture =  robot.createScreenCapture(awtBounds);
                try {
                    capturedFramesQueue.put(screenCapture);
                } catch (InterruptedException e) {
                }
            }
        }
    });
}

FrameEncoder.java:

public void run() {
    isRunning = true;
    String outFile = outputdirectoryPath + outputFileName;
    // First, let's make a IMediaWriter to write the file.
    final IMediaWriter writer = ToolFactory.makeWriter(outFile);
    // Retrieve the first frame to guess video dimensions
    BufferedImage firstFrame = null;
    try {
        firstFrame = capturedFramesQueue.take();
    } catch (InterruptedException e) {
    }
    if (firstFrame == null) {
        return;
    }
    // We tell it we're going to add one video stream, with id 0,
    // at position 0, and that it will have a fixed frame rate of
    // FRAME_RATE.
    writer.addVideoStream(0, 0,
            IVideoEncoderConfiguration.FRAME_RATE,
            firstFrame.getWidth(), firstFrame.getHeight());

    long startTime = System.nanoTime();
    for (numberOfFramesRecorded = 0; isRunning
            && numberOfFramesRecorded <= IVideoEncoderConfiguration.MAXIMUM_NUMBER_OF_FRAMES; numberOfFramesRecorded++) {
        // Retrieve the captured frame
        try {
            final BufferedImage currentFrame = convertToType(capturedFramesQueue.take(), BufferedImage.TYPE_3BYTE_BGR);
            // encode the next frame
            writer.encodeVideo(0, currentFrame, System.nanoTime() - startTime,
                    TimeUnit.NANOSECONDS);
            // sleep, time depending of FRAME_RATE
            Thread.sleep(IVideoEncoderConfiguration.CAPTURE_TIME_INTERVAL_MILLIS);
        } catch (InterruptedException e) {
        }
    }
    // Get the remaining frame on the queue
    Collection<BufferedImage> frames = new LinkedList<BufferedImage>();
    capturedFramesQueue.drainTo(frames, IVideoEncoderConfiguration.MAXIMUM_NUMBER_OF_FRAMES - numberOfFramesRecorded);
    for (BufferedImage frame : frames) {
        BufferedImage currentFrame = convertToType(frame, BufferedImage.TYPE_3BYTE_BGR);
        writer.encodeVideo(0, currentFrame, System.nanoTime() - startTime,
                TimeUnit.NANOSECONDS);
    }
    // close the MediaWriter, write the trailer if needed
    writer.close();
}

问题答案:

我知道已经晚了一点,但是问题是Xuggler要求所有的DLL都位于操作系统的加载路径环境中,而不仅仅是java.library.path

这意味着与Xuggle一起安装的所有DLL(例如libavcodec.dll)都必须位于启动Java的进程的%PATH%环境变量中。



 类似资料:
  • 问题内容: 我正在使用Ubuntu 11.04和Eclipse。我已成功安装Xuggler,并在其FAQ中检查了环境变量以及与linux相关的所有内容:http://wiki.xuggle.comFrequently_Asked_Questions#What.27s_up_with_java.lang.UnsatisfiedLinkError.3F 我还根据他们的教程设置了Eclipse:http

  • 全部的我和你有一个很奇怪的问题https://github.com/json-path/JsonPath 其中一个问题似乎是实现中存在的重入问题:当执行路径时,每个片段返回一个字符串: 我通过将JSONObject/JSONArray传递给JsonPath.read()而不是JSON字符串来“黑客”。做完后,现在我得到了: 如您所见,这已经是一个数组。我在谷歌上搜索了很多次,但都找不到问题所在。

  • 我安装了Apache Tomcat来使用servlet。我设置了很少的系统变量。 Catalina_home C:\ruby200\bin;C:\program files\java\jdk1.7.0_09\bin;C:\users\home\appdata\roaming\npm

  • 在bash_profile中,java_home的设置如下所示 导出java_home=$(/usr/libexec/java_home) /usr/bin/java 命令java给出下面的路径 /usr/bin/java 命令“ls-la/usr/bin/java”提供以下链接 LRWXR-XR-X1根轮74 2019年1月15日/usr/bin/java->/system/library/fr

  • 使用docx4j,我能够解析来自CTRect和CTOval对象的椭圆和矩形。但是当我使用自定义形状时,docx4j给出了CTShape或CTShapeType中的对象。我已经阅读了VML规范链接。 路径值有时具有以下值 null

  • 我有以下分布 主要的jar包含main方法,我想在其中访问lib提供的本机函数。所以被捆绑在发行版中。开始sh只需设置java的类路径和引导。 加载库的最佳方法是什么。那么应用程序内部的库呢?我知道两种方法: 系统。加载(绝对路径) 系统。loadLibrary(名称) 前者需要库在文件系统中的绝对路径,后者需要设置特定于应用程序的java。图书馆路径JVM参数。在这种情况下,哪种解决方案更好?将