Ok, это то, что я получил с помощью этого JavaCV library и их примеры:
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-архива. Может быть, вам не нужны все они, но я не раскопал.
Вы можете играть с настройками и исследовать примеры и источники. Из того, что я видел, это довольно мощная библиотека.
Редактировать
Просто обработка видео часть:
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 камеры.
Edit 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 в вопросе youe, просто 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);
}
}
Что вы имеете в виду под "добавить xuggle в пути? Насколько я понимаю, он имеет свои собственные зависимости и нуждается в некоторых предварительно скомпилированных двоичных файлах, которые вы должны предоставить вручную, если вы не используете maven или что-то еще. – whitesite
Я добавляю к своему проекту eclipse webcam-capture, затем xuggle_3.4, а затем slf4j и bridj-0.6.2. Я не знаю, что еще я должен добавить. –
В принципе, ['UnsatisfiedLinkError'] (https://docs.oracle.com/javase/8/docs/api/java/lang/UnsatisfiedLinkError.html) означает, что xuggle не может найти требуемые библиотеки. Если вы прочитали [инструкции по загрузке xuggle] (http://www.xuggle.com/downloads), вы увидите, что вам нужно предоставить все его зависимости и предварительно скомпилированные двоичные файлы. Использование maven было бы намного проще. – whitesite