我正在用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参数。在这种情况下,哪种解决方案更好?将