我正在尝试从一个java应用程序中捕获视频屏幕截图。我没有加载sarxos/webcam-capture库。我在我的项目中添加了可执行的jar。有点乱。我想从我创建的一个简单的javafx界面上捕获视频。问题是,在安装了lib和slf4之后,它就需要安装xuggle。我在路径中添加了xuggle,我的代码如下:
File file = new File("output.ts");
IMediaWriter writer = ToolFactory.makeWriter(file.getName());
Dimension size = WebcamResolution.QVGA.getSize();
writer.addVideoStream(0, 0, ICodec.ID.CODEC_ID_H264, size.width, size.height);
Webcam webcam = Webcam.getDefault();
webcam.setViewSize(size);
webcam.open(true);
long start = System.currentTimeMillis();
for (int i = 0; i < 50; i++) {
System.out.println("Capture frame " + i);
BufferedImage image = ConverterFactory.convertToType(webcam.getImage(), BufferedImage.TYPE_3BYTE_BGR);
IConverter converter = ConverterFactory.createConverter(image, IPixelFormat.Type.YUV420P);
IVideoPicture frame = converter.toPicture(image, (System.currentTimeMillis() - start) * 1000);
frame.setKeyFrame(i == 0);
frame.setQuality(0);
writer.encodeVideo(0, frame);
// 10 FPS
Thread.sleep(100);
}
writer.close();
System.out.println("Video recorded in file: " + file.getAbsolutePath());不过,我收到以下资料:
Caused by: java.lang.UnsatisfiedLinkError: no xuggle-ferry in java.library.pathEDIT2 --我也尝试了jxcapture库。我在我的项目中添加了所有必需的库,我运行了以下代码:在这里输入链接描述,代码运行良好--我设法存储视频,但是最终我收到了以下错误:
8614 JNIWrapper.ShutdownHook ERROR com.jniwrapper.NativeResourceCollector - com.jniwrapper.FunctionExecutionException:回调参数类型或其计数在com.jniwrapper.NativeResourceCollector方法中不正确)
知道这个错误是关于什么的吗?JNIWrapper.ShutdownHook是什么?我在3台不同的机器上尝试了这些代码,而这只发生在其中一台机器上?我如何处理这个异常?
EDIT3:我试过@whitesite求婚EDIT3。gui启动了,我有两个按钮开始和停止,开始按钮打开相机,当我试图停止时,我收到以下消息:
java.lang.NullPointerException:参数0的指针地址为NULL。在org.bytedeco.javacpp.opencv_videoio$VideoWriter.write(Native方法上)在org.bytedeco.javacv.OpenCVFrameRecorder.record(OpenCVFrameRecorder.java:105) at Test1.lambda$0(Test1.java:52)在java.lang.Thread.run(未知源)
发布于 2016-07-05 12:14:31
类路径中缺少slf4-api-ver.jar。但是,仅仅添加api是不够的,您还需要像slf4j这样的提供程序-simple-ver.jar。最新版本为1.7.21,可从此处下载http://www.slf4j.org/download.html
发布于 2016-07-09 14:40:03
好的,这就是我使用这个JavaCV库和他们的例子所得到的:
public class Test extends Application {
public void start(Stage primaryStage) throws Exception {
OpenCVFrameGrabber capture = OpenCVFrameGrabber.createDefault(0);
capture.start();
OpenCVFrameConverter.ToIplImage converter = new OpenCVFrameConverter.ToIplImage();
Java2DFrameConverter javaConverter = new Java2DFrameConverter();
VBox root = new VBox();
Canvas canvas = new Canvas();
canvas.setHeight(capture.getImageHeight());
canvas.setWidth(capture.getImageWidth());
root.getChildren().add(canvas);
Scene scene = new Scene(root, capture.getImageWidth(), capture.getImageHeight());
primaryStage.setTitle("Live video");
primaryStage.setScene(scene);
primaryStage.show();
Thread videoProcessor = new Thread(() -> {
File output = new File("C:/Work/test.avi");
OpenCVFrameRecorder recorder = new OpenCVFrameRecorder(output, capture.getImageWidth(), capture.getImageHeight());
try {
recorder.setVideoCodec(opencv_videoio.CV_FOURCC((byte) 'M', (byte) 'J', (byte) 'P', (byte) 'G'));
recorder.start();
while (true) {
if(Thread.currentThread().isInterrupted()){
break;
}
Frame frame = capture.grab();
Platform.runLater(()->{
BufferedImage image = javaConverter.getBufferedImage(frame, 1.0, false, null);
canvas.getGraphicsContext2D().drawImage(SwingFXUtils.toFXImage(image, null),0,0);
});
recorder.record(frame);
}
recorder.stop();
capture.release();
recorder.release();
} catch (Exception e) {
e.printStackTrace();
}
});
primaryStage.setOnCloseRequest(e->{
videoProcessor.interrupt();
});
videoProcessor.start();
}
public static void main(String[] args) throws Exception {
launch(args);
}
}它捕获视频从网络摄像头和翻译它的现场和在同一时间写入文件。您需要使用maven或手动安装将它们的库包含在类路径中,还需要使用二进制zip存档中的所有jars。也许你不需要所有的,但我并没有深入挖掘。
你可以玩设置和调查的例子和来源。据我所见,它是一个非常强大的图书馆。
编辑
视频处理部分:
Thread videoProcessor = new Thread(() -> {
OpenCVFrameGrabber capture = null;
FrameRecorder recorder = null;
try {
File output = new File("C:/Work/test2.avi");
capture = OpenCVFrameGrabber.createDefault(0);
capture.start();
recorder = FrameRecorder.createDefault(output, capture.getImageWidth(), capture.getImageHeight());
recorder.setFrameRate(8);
recorder.setVideoCodec(opencv_videoio.CV_FOURCC((byte) 'M', (byte) 'J', (byte) 'P', (byte) 'G'));
recorder.start();
long l = System.currentTimeMillis();
while (true) {
if(Thread.currentThread().isInterrupted()){
break;
}
recorder.record(capture.grab());
}
} catch (Exception e) {
e.printStackTrace();
} finally {
try {
recorder.stop();
capture.release();
recorder.release();
} catch (Exception e) {
e.printStackTrace();
}
}
});您需要在某个地方启动处理videoProcessor.start(),然后中断它以停止录制videoProcessor.interrupt()。您还可能需要设置适当的记录器帧速率,以调整它到您的相机fps。
编辑2
输出可用设备的代码:
int n = org.bytedeco.javacpp.videoInputLib.videoInput.listDevices();
for (int i = 0; i < n; i++) {
System.out.println(i + " = " + org.bytedeco.javacpp.videoInputLib.videoInput.getDeviceName(i));
} 编辑3
如果网络摄像头-捕获工作,你可以用它来捕获图像并使用javaCV将这些图像记录到视频文件中(就像你的问题中的exapmle,只是javaCV而不是xuggler)。这是一个小型javafx应用程序,它有两个按钮:'Start‘启动videoProcessing线程来捕获视频,'Stop’打断这个线程:
import com.github.sarxos.webcam.Webcam;
import javafx.application.Application;
import javafx.scene.Scene;
import javafx.scene.control.Button;
import javafx.scene.layout.VBox;
import javafx.stage.Stage;
import org.bytedeco.javacpp.opencv_videoio;
import org.bytedeco.javacv.Java2DFrameConverter;
import org.bytedeco.javacv.OpenCVFrameRecorder;
import java.awt.Dimension;
import java.awt.image.BufferedImage;
import java.io.File;
public class Test1 extends Application {
public void start(Stage primaryStage) throws Exception {
final double FPS = 25;
final int WIDTH = 640;
final int HEIGHT = 480;
Webcam webcam = Webcam.getDefault();
webcam.setViewSize(new Dimension(WIDTH, HEIGHT));
Java2DFrameConverter javaConverter = new Java2DFrameConverter();
VBox root = new VBox();
Button b1 = new Button("Start");
Button b2 = new Button("Stop");
root.getChildren().addAll(b1, b2);
Scene scene = new Scene(root, 300,200);
primaryStage.setTitle("Test");
primaryStage.setScene(scene);
Runnable r = () -> {
File output = new File("C:/Work/test.avi");
OpenCVFrameRecorder recorder = new OpenCVFrameRecorder(output, WIDTH, HEIGHT);
recorder.setFrameRate(FPS);
try {
recorder.setVideoCodec(opencv_videoio.CV_FOURCC((byte) 'M', (byte) 'J', (byte) 'P', (byte) 'G'));
recorder.start();
webcam.open();
while (true) {
if(Thread.currentThread().isInterrupted()){
break;
}
BufferedImage image = webcam.getImage();
recorder.record(javaConverter.getFrame(image));
try {
Thread.sleep(1000 / (long)FPS);
} catch (InterruptedException ie) {
break;
}
}
recorder.stop();
recorder.release();
webcam.close();
} catch (Exception e) {
e.printStackTrace();
}
};
b1.setOnAction(e->{
Thread t = new Thread(r);
t.start();
b2.setOnAction(e2->t.interrupt());
});
primaryStage.show();
}
public static void main(String[] args) throws Exception {
launch(args);
}
}https://stackoverflow.com/questions/38203029
复制相似问题