2011-11-10 22 views
1

Javaでスクリーンキャストアプリケーションを作成しています。 私はそれを行うためにXuggleを使用することに決めました。そして私はxuggle wikiのインストール手順をフォローアップしました。XuggleとJavaライブラリパス

%XUGGLE_HOME%\ binと%XUGGLE_HOME%\ libを使用してPATH環境を設定しました。すべてがOKと思われます。 私はこのアプリケーションをRCPプラグインとして作った。 "RCP-mail"テンプレートで試してみましたが、プラグインが動作しており、ビデオが正しく生成されています。

私は「本物の」アプリケーションでそれを使用することを決めたときには、プラグインは、奇妙なエラーメッセージが表示されてクラッシュした:java.library.pathには十分に定義されているため

Starting Capture

2011-11-10 08:08:45,438 [Thread-5] WARN com.xuggle.ferry.JNILibraryLoader - Failure: library load of library: xuggle-xuggler; version: 3: absolute path: C:\Program Files (x86)\Xuggle\bin\libxuggle-xuggler-3.dll; error: java.lang.UnsatisfiedLinkError: C:\Program Files (x86)\Xuggle\bin\libxuggle-xuggler-3.dll: Can't find dependent libraries

2011-11-10 08:08:45,447 [Thread-5] WARN com.xuggle.ferry.JNILibraryLoader - Failure: library load of library: xuggle-xuggler; version: 3: absolute path: C:\Program Files (x86)\Xuggle\bin\libxuggle-xuggler-3.dll; error: java.lang.UnsatisfiedLinkError: C:\Program Files (x86)\Xuggle\bin\libxuggle-xuggler-3.dll: Can't find dependent libraries

2011-11-10 08:08:45,453 [Thread-5] 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

しかし、この奇妙な:私は、このアプリケーションシートでプラグインの仕事をするために欠けている何

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

答えて

2

それは少し遅れて、私が知っているのですしかし、問題は、XugglerはすべてのDLLがオペレーティングシステムのロードパス環境になければならず、jだけでなくava.library.path

つまり、Xuggle(たとえばlibavcodec.dll)でインストールするすべてのDLLは、Javaを起動したプロセスの%PATH%環境変数にある必要があります。

1

原因依存関係のjarファイルまたはバージョンの競合が使用不能になる可能性があります。クラスパスに次のjarファイルを追加する

は私のためにうまく働いた:

xuggle-xuggler-5.4.jar SLF4J-API-1.6.4.jar logback-コア-1.0.0.jar logbackを-classic-1.0.0.jar

関連する問題