ОШИБКА com.xuggle.ferry.JNILibraryLoader - Не удалось загрузить библиотеку: xuggle-xuggler; версия: 3;

Недавно я загрузил код для Руководство по Xuggler: захват кадров и создание видео с сайта эта ссылка, я добавил все необходимые файлы .jar в свой проект для запуска этого кода, но когда я запускаю этот код, я получаю сообщение об ошибке:

Вот мой код:

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

и я получаю следующую ошибку в этом.

[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

Объясните, почему Class-Loader не может загрузить файл .jar.


person Mayank Tiwari    schedule 06.08.2013    source источник
comment
Похоже, что родная скомпилированная библиотека (.so, .dll или .dylib) не может быть найдена   -  person Aleks G    schedule 06.08.2013


Ответы (4)


Проблема в том, что родные библиотеки, которые использует Xuggle, не могут быть найдены. Я подозреваю, что в вашем пути к классам есть конфликт.

Если под «всеми банками» вы подразумеваете банки на странице загрузки, вы не должны загружать их все. На странице загрузок Xuggler указано, что либо вы загружаете файл xuggle‑xuggler.jar, содержащий собственные библиотеки для всех операционных системы или вы выбираете конкретную архитектуру.

При попытке запустить пример, на который вы ссылаетесь, я сделал следующее:

  • Загружено xuggle– xuggler.jar (v.5.2). Я не использовал maven, поэтому в соответствии с инструкциями на странице загрузки я открыл Xuggle POM-файл для проверки и получения зависимостей с использованием конкретных версий.
  • Используя небольшую помощь от Google, эти зависимости: slf4j-1.6.4 , commons-cli 1.1, logback 1.0 (содержит два необходимых файла jar), xuggle-utils 1.20 и junit, которые вы можете игнорировать.
    После загрузки вы можете найти внутри zip-файлов 5 jar-файлов (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), описанных в файле POM, которые являются зависимостями файла xuggle‑xuggler.jar.
  • Создайте проект в своей любимой среде IDE (я использую Eclipse), импортируйте эти 6 файлов jar в свой проект, и все готово.

Следуя приведенной выше процедуре, я смог успешно запустить вашу тестовую программу на компьютере с Windows.

Надеюсь, это поможет.

person c.s.    schedule 08.08.2013
comment
не могли бы вы помочь с сообщением ошибка com xuggle Ferry jnilibraryloader не может загрузить библиотеку oc">stackoverflow.com/questions/21672099/ - person Sazzad Hissain Khan; 10.02.2014
comment
эти ссылки на банки не работают, не могли бы вы обновить свой ответ - person Narendra Jaggi; 12.05.2016
comment
@Jaggz ссылки не работают, но обновленного ответа нет. Если вы посетите страницу xuggler на github, вы увидите, что она устарела, и автор предлагает использовать Вместо этого Humble video - person c.s.; 14.05.2016

Похоже, что лучшим решением является использование Xuggler 5.4 с maven из-за Как мне установить/настроить Xuggle, чтобы не получить ошибку UnsatisfiedLinkError?

person Ilya Yevlampiev    schedule 23.10.2014

После ответа cs это сработало для меня:

  • Вместо xuggle-xuggler.jar используйте xuggle-xuggler-5.4.jar (погуглите название, если ссылка не работает)

  • Вместо xuggle-utils-1.20.688.jar используйте com.xuggle.utils-1.22.jar

  • Создайте проект, импортируйте 6 банок и запустите его для проверки:

    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;
        }
    }
    
person spreus    schedule 16.09.2016

Просто загрузите xuggler 3.4 exe в ОС Windows и добавьте файл jar 1) xuggle-xuggler-arch-x86_64-w64-mingw32.jar, вы получите этот jar по следующей ссылке:
https://files.liferay.com/mirrors/xuggle.googlecode.com/svn/trunk/repo/share/java/xuggle/xuggle-xuggler/5.4/

person Palash Hinglaspurkar    schedule 19.11.2018