ERROR com.xuggle.ferry.JNILibraryLoader - Could not load library: xuggle-xuggler; version: 3;
Asked Answered
B

4

3

I have recently downloaded a code for, Xuggler Tutorial: Frames Capture and Video Creation from this link, I have added all the .jar files in my project which are required to run this code but, When I am running this code then I am getting Error:

Here is my code:

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

and I am getting following error in this.

[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

Please explain why Class-Loader is unable to load the .jar file.

Backcourt answered 6/8, 2013 at 10:15 Comment(1)
Looks like the native compiled library (.so, .dll or .dylib) can't be foundIoneionesco
P
4

The problem you have is that the native libraries that Xuggle uses cannot be found. I suspect that there is a conflict in your classpath.

If by "all the jars" you mean the jars in the download page, you are not supposed to download all of them. At the Xuggler downloads page it says that either you download the xuggle‑xuggler.jar that contains the native libraries for all operating systems or you choose a specific architecture.

On an attempt to run the example you link to, I have done the following:

  • Downloaded xuggle‑xuggler.jar (v.5.2). I didn't use maven, so as per the instrunctions at the download page I opened the Xuggle POM file to check and get the dependencies using the specific versions.
  • Using a little help from google those dependencies are: slf4j-1.6.4, commons-cli 1.1, logback 1.0, (contains two of the required jars), xuggle-utils 1.20 and junit which you can ignore.
    After downloading you can find inside the zip files the 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) described in the POM file that are the dependencies of the xuggle‑xuggler.jar.
  • Create a project in your favourite IDE (I use Eclipse) import those 6 jar files to your project and you are good to go.

Following the procedure above I was able to run your test program succesfully in a Windows machine.

I hope that helps.

Powell answered 8/8, 2013 at 23:36 Comment(3)
can you please help for the post #21672599Boley
these can links are broken , can you please update your answerIngenerate
@Jaggz the links are broken but there is no updated answer. If you visit xuggler's github page you will see that it is now deprecated and the author suggests to use Humble video insteadPowell
M
0

It looks like the best solution is to use Xuggler 5.4 with maven due to How do I have to install/configure Xuggle to not get an UnsatisfiedLinkError?

Mesozoic answered 23/10, 2014 at 13:27 Comment(1)
Using xuggle 5.4 with maven in Linux but getting the same error: Could not load library: xuggle; version: 5 java.lang.UnsatisfiedLinkError: no xuggle in java.library.path: /usr/java/packages/lib:/lib:/usr/lib. Mac (dev) is working fineVictorious
S
0

Following c.s.'s answer this ended out working for me:

  • Instead of xuggle‑xuggler.jar use xuggle-xuggler-5.4.jar (google the name if link is broken)

  • Instead of xuggle-utils-1.20.688.jar use com.xuggle.utils-1.22.jar

  • Create a project, import the 6 jars and run this to test:

    import com.xuggle.xuggler.ICodec;
    import com.xuggle.mediatool.ToolFactory;
    import com.xuggle.mediatool.IMediaWriter;
    import java.awt.image.BufferedImage;
    import java.io.File;
    import java.util.concurrent.TimeUnit;
    
    public class XuggleTest {
    
        private static int idx = 1;
        private static final int WIDTH = 500;
        private static final int HEIGHT = 500;
        private static final int NFRAMES = 200;
    
        public static void main(String[] arguments) {
    
            // Create writer
            IMediaWriter writer = ToolFactory.makeWriter("output.mp4");
            writer.addVideoStream(0, 0, ICodec.ID.CODEC_ID_MPEG4, WIDTH, HEIGHT);
            long ms = 15; // ms per frame
    
            for (int i = 0; i < NFRAMES; i++) {
    
                BufferedImage frame = convert(getFrame());
                long time = i * ms;
                writer.encodeVideo(0, frame, time, TimeUnit.MILLISECONDS);
    
                idx++;
            }
            System.out.println("Finished writing file: " + System.getProperty("user.dir") + File.separator + writer.getUrl());
    
            writer.close();
        }
    
        private static BufferedImage convert(BufferedImage value) {
            // Convert data type
            BufferedImage result = new BufferedImage(value.getWidth(), value.getHeight(), BufferedImage.TYPE_3BYTE_BGR);
            result.getGraphics().drawImage(value, 0, 0, null);
            return result;
        }
    
        private static BufferedImage getFrame() {
            // Create image frame
            BufferedImage img = new BufferedImage(WIDTH, HEIGHT, BufferedImage.TYPE_INT_ARGB);
            img.createGraphics().fillRoundRect(idx, idx, idx, idx, 10, 10);
            return img;
        }
    }
    
Sigfrid answered 16/9, 2016 at 14:10 Comment(0)
C
0

Just download the xuggler 3.4 exe in Windows OS and add the jar file 1) xuggle-xuggler-arch-x86_64-w64-mingw32.jar you get this jar from the following link:
https://files.liferay.com/mirrors/xuggle.googlecode.com/svn/trunk/repo/share/java/xuggle/xuggle-xuggler/5.4/

Cassicassia answered 19/11, 2018 at 5:54 Comment(0)

© 2022 - 2024 — McMap. All rights reserved.