首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >错误com.xuggle.ferry.JNILibraryLoader -无法加载库:xuggler;版本: 3;

错误com.xuggle.ferry.JNILibraryLoader -无法加载库:xuggler;版本: 3;
EN

Stack Overflow用户
提问于 2013-08-06 10:15:18
回答 4查看 9.6K关注 0票数 3

我最近下载了一个代码,用于“Xuggler教程:来自此链接的帧捕获和视频创建”,我在我的项目中添加了运行该代码所需的所有.jar文件,但是,当我运行此代码时,会出现错误:

这是我的代码:

代码语言:javascript
复制
package xug;

import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;

import javax.imageio.ImageIO;

import com.xuggle.mediatool.IMediaReader;
import com.xuggle.mediatool.MediaListenerAdapter;
import com.xuggle.mediatool.ToolFactory;
import com.xuggle.mediatool.event.IVideoPictureEvent;
import com.xuggle.xuggler.Global;

public class VideoThumbnailsExample {

    public static final double SECONDS_BETWEEN_FRAMES = 10;
    private static final String inputFilename = "e:/low_light.mp4";
    private static final String outputFilePrefix = "e:/Frames/processedImages";
    // The video stream index, used to ensure we display frames from one and
    // only one video stream from the media container.
    private static int mVideoStreamIndex = -1;
    // Time of last frame write
    private static long mLastPtsWrite = Global.NO_PTS;
    public static final long MICRO_SECONDS_BETWEEN_FRAMES =
            (long) (Global.DEFAULT_PTS_PER_SECOND * SECONDS_BETWEEN_FRAMES);

    public static void main(String[] args) {

        IMediaReader mediaReader = ToolFactory.makeReader(inputFilename);

        // stipulate that we want BufferedImages created in BGR 24bit color space
        mediaReader.setBufferedImageTypeToGenerate(BufferedImage.TYPE_3BYTE_BGR);

        mediaReader.addListener(new ImageSnapListener());

        // read out the contents of the media file and
        // dispatch events to the attached listener
        while (mediaReader.readPacket() == null) ;

    }

    private static class ImageSnapListener extends MediaListenerAdapter {

        public void onVideoPicture(IVideoPictureEvent event) {

            if (event.getStreamIndex() != mVideoStreamIndex) {
                // if the selected video stream id is not yet set, go ahead an
                // select this lucky video stream
                if (mVideoStreamIndex == -1) {
                    mVideoStreamIndex = event.getStreamIndex();
                } // no need to show frames from this video stream
                else {
                    return;
                }
            }

            // if uninitialized, back date mLastPtsWrite to get the very first frame
            if (mLastPtsWrite == Global.NO_PTS) {
                mLastPtsWrite = event.getTimeStamp() - MICRO_SECONDS_BETWEEN_FRAMES;
            }

            // if it's time to write the next frame
            if (event.getTimeStamp() - mLastPtsWrite
                    >= MICRO_SECONDS_BETWEEN_FRAMES) {

                String outputFilename = dumpImageToFile(event.getImage());

                // indicate file written
                double seconds = ((double) event.getTimeStamp())
                        / Global.DEFAULT_PTS_PER_SECOND;
                System.out.printf(
                        "at elapsed time of %6.3f seconds wrote: %s\n",
                        seconds, outputFilename);

                // update last write time
                mLastPtsWrite += MICRO_SECONDS_BETWEEN_FRAMES;
            }

        }

        private String dumpImageToFile(BufferedImage image) {
            try {
                String outputFilename = outputFilePrefix
                        + System.currentTimeMillis() + ".png";
                ImageIO.write(image, "png", new File(outputFilename));
                return outputFilename;
            } catch (IOException e) {
                e.printStackTrace();
                return null;
            }
        }
    }
}

在这件事上,我得到了一个错误。

代码语言:javascript
复制
[main] ERROR com.xuggle.ferry.JNILibraryLoader - Could not load library: xuggle-xuggler; version: 3; Visit http://www.xuggle.com/xuggler/faq/ to find common solutions to this problem
java.lang.UnsatisfiedLinkError: no xuggle-xuggler in java.library.path
    at java.lang.ClassLoader.loadLibrary(ClassLoader.java:1860)
    at java.lang.Runtime.loadLibrary0(Runtime.java:845)
    at java.lang.System.loadLibrary(System.java:1084)
    at com.xuggle.ferry.JNILibraryLoader.loadLibrary0(JNILibraryLoader.java:265)
    at com.xuggle.ferry.JNILibraryLoader.loadLibrary(JNILibraryLoader.java:168)
    at com.xuggle.xuggler.XugglerJNI.<clinit>(XugglerJNI.java:19)
    at com.xuggle.xuggler.Global.<clinit>(Global.java:238)
    at xug.VideoThumbnailsExample.<clinit>(VideoThumbnailsExample.java:28)
Exception in thread "main" Java Result: 1

请解释为什么类加载器无法加载.jar文件.

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2013-08-08 23:36:34

您面临的问题是,无法找到Xuggle使用的本地库。我怀疑你的类路径中有冲突。

如果你所说的“所有的罐子”是指下载页面中的罐子,那么你不应该下载所有的罐子。在Xuggler下载页面,它说要么下载包含所有操作系统的本机库的xuggle‑xuggler.jar,要么选择特定的体系结构。

在尝试运行链接到的示例时,我执行了以下操作:

  • 下载[医] (v.5.2)。我没有使用maven,所以按照下载页面上的说明,我打开了Xuggle文件来使用特定的版本检查和获取依赖项。
  • 使用谷歌的一些帮助,这些依赖关系是:slf4j-1.6.4共用-cli 1.1logback 1.0 (包含两个所需的jars)、* 1.20junit,您可以忽略它们。 下载后,您可以在zip文件中找到POM文件中描述的5 jars (slf4j-api-1.6.4.jar, commons-cli-1.1.jar, logback-core-1.0.0.jar, logback-classic-1.0.0.jar, xuggle-utils-1.20.688.jar),它们是xuggle‑xuggler.jar的依赖项。
  • 在您最喜欢的IDE (我使用Eclipse)中创建一个项目,将这6个jar文件导入到您的项目中,您就可以继续了。

按照上面的步骤,我能够在Windows机器上成功地运行您的测试程序。

我希望这能帮上忙。

票数 4
EN

Stack Overflow用户

发布于 2014-10-23 13:27:19

看起来最好的解决方案是,由于我必须如何安装/配置Xuggle才能不获得UnsatisfiedLinkError?的原因,在maven中使用Xaggler5.4

票数 0
EN

Stack Overflow用户

发布于 2016-09-16 14:10:45

在C.S.的回答之后,我的工作结束了:

  • 不要使用xuggle-xuggler-5.4.jar (如果链接被破坏的话,谷歌的名字是google),而不是xaggle-xggler.jar。
  • 使用com.xuggle.utils-1.22.jar代替xuggle 1.20.688.jar
  • 创建一个项目,导入6 jars并运行它来测试: 导入com.xuggle.xuggler.ICodec;导入com.xuggle.mediatool.ToolFactory;导入com.xuggle.mediatool.IMediaWriter;导入java.awt.image.BufferedImage;导入java.io.File;导入java.util.concurrent.TimeUnit;公共类XuggleTest {私有静态int = 1;私有静态最终int宽度= 500;私有静态最终int高度= 500;私有静态最终int = 200;公共静态空白main(String[]参数){ //创建写入器IMediaWriter writer = ToolFactory.makeWriter("output.mp4");writer.addVideoStream(0,0,ICodec.ID.CODEC_ID_MPEG4,宽度、高度);长ms = 15;// ms每帧为(int i= 0;i< NFRAMES;i++) { BufferedImage框架=转换(getFrame();长时间=i* ms;writer.encodeVideo(0,帧,时间,TimeUnit.MILLISECONDS);idx++;}System.out.println(“已完成的写入文件:”+ System.getProperty("user.dir") + File.separator +writer.getUrl();writer.close();}私有静态BufferedImage转换( BufferedImage值){ //转换数据类型BufferedImage result =新BufferedImage(value.getWidth(),value.getHeight(),BufferedImage.TYPE_3BYTE_BGR);result.getGraphics().drawImage(值,0,0,null);返回结果;}私有静态BufferedImage getFrame() { //创建图像帧BufferedImage img =新的BufferedImage(宽度、高度、BufferedImage.TYPE_INT_ARGB);img.createGraphics().fillRoundRect(idx,10);返回img;}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/18077307

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档