Ok, questo è quello che ho ottenuto con questa JavaCV library e loro esempi:
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);
}
}
Cattura video da web cam e lo traduce dal vivo e nello stesso tempo scrive su file. È necessario includere la loro libreria in classpath usando Maven o l'installazione manuale e anche tutti i vasi dall'archivio zip binario. Forse non hai bisogno di tutti loro, ma non ho scavato in profondità.
È possibile giocare con le impostazioni e ricercare esempi e fonti. Da quello che ho visto è una libreria piuttosto potente.
Modifica
Proprio il video parte di elaborazione:
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();
}
}
});
devi avviare il processo videoProcessor.start()
da qualche parte e poi interromperlo per interrompere la registrazione videoProcessor.interrupt()
. Potrebbe anche essere necessario impostare la corretta frequenza dei fotogrammi del registratore per regolarla sui fps della fotocamera.
Edit 2
Codice di dispositivi disponibili di uscita:
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));
}
Edit 3
Se lavori webcam-acquisizione, che si può usare per catturare immagini e utilizzare javaCV per registrare queste immagini in file video (più o meno come l'esempio nella tua domanda, solo javaCV invece di xuggler).Questa è una piccola applicazione JavaFX, che ha due pulsanti: 'Start' inizia il filo videoProcessing per catturare video e gli interrupt 'Stop' questa discussione:
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);
}
}
Che cosa si intende per 'aggiungo xuggle nel percorso'? Come ho capito, ha le sue dipendenze e ha bisogno di alcuni binari precompilati, che è necessario fornire manualmente nel caso in cui non si usi Maven o qualcosa del genere. – whitesite
Aggiungo al mio progetto eclipse webcam-capture quindi xuggle_3.4 poi slf4j e bridj-0.6.2. Non so cos'altro dovrei aggiungere. –
Fondamentalmente, ['UnsatisfiedLinkError'] (https://docs.oracle.com/javase/8/docs/api/java/lang/UnsatisfiedLinkError.html) significa che xuggle non riesce a trovare le librerie richieste. Se leggi [xuggle download instructions] (http://www.xuggle.com/downloads), vedrai che devi fornire tutte le sue dipendenze e binari precompilati. Usare Maven sarebbe molto più facile. – whitesite