将网络摄像头的图像保存为视频

时间:2017-12-05 14:56:40

标签: java video webcam encode mp4

我正在开展项目工作,我希望将使用Webcam Capture获得的图像编码为.mp4文件。

我尝试了它在GitHub上的Encoder,但它一直给我错误的指令甚至不在库中(例如com.github.sarxos.webcam.WebcamProcessor)。

我该如何解决这个问题?

我是否遗漏了某些内容,或者我是否必须使用其他方法来执行此操作?

package application.Webcam;

import java.awt.Dimension;
import java.awt.image.BufferedImage;
import java.io.File;
import java.util.concurrent.atomic.AtomicReference;

import javafx.application.Application;
import javafx.application.Platform;
import javafx.beans.property.ObjectProperty;
import javafx.beans.property.SimpleObjectProperty;
import javafx.beans.value.ChangeListener;
import javafx.beans.value.ObservableValue;
import javafx.collections.FXCollections;
import javafx.collections.ObservableList;
import javafx.concurrent.Task;
import javafx.embed.swing.SwingFXUtils;
import javafx.event.ActionEvent;
import javafx.event.EventHandler;
import javafx.geometry.Orientation;
import javafx.geometry.Pos;
import javafx.scene.Scene;
import javafx.scene.control.Button;
import javafx.scene.control.ComboBox;
import javafx.scene.control.Label;
import javafx.scene.image.Image;
import javafx.scene.image.ImageView;
import javafx.scene.image.WritableImage;
import javafx.scene.layout.BorderPane;
import javafx.scene.layout.FlowPane;
import javafx.stage.Stage;


public class WebCamAppLauncher extends Application {

private class WebCamInfo {

    private String webCamName;
    private int webCamIndex;

    public String getWebCamName() {
        return webCamName;
    }

    public void setWebCamName(String webCamName) {
        this.webCamName = webCamName;
    }

    public int getWebCamIndex() {
        return webCamIndex;
    }

    public void setWebCamIndex(int webCamIndex) {
        this.webCamIndex = webCamIndex;
    }

    @Override
    public String toString() {
        return webCamName;
    }
}

private FlowPane bottomCameraControlPane;
private FlowPane topPane;
private BorderPane root;
private String cameraListPromptText = "Choose Camera";
private ImageView imgWebCamCapturedImage;
private Webcam webCam = null;
private boolean stopCamera = false;
private BufferedImage grabbedImage;
private ObjectProperty<Image> imageProperty = new SimpleObjectProperty<Image>();
private BorderPane webCamPane;
private Button btnCamreaStop;
private Button btnCamreaStart;
private Button btnCameraRecord;

@Override
public void start(Stage primaryStage) {

    primaryStage.setTitle("Connecting Camera Device Using Webcam Capture API");

    root = new BorderPane();
    topPane = new FlowPane();
    topPane.setAlignment(Pos.CENTER);
    topPane.setHgap(20);
    topPane.setOrientation(Orientation.HORIZONTAL);
    topPane.setPrefHeight(40);
    root.setTop(topPane);
    webCamPane = new BorderPane();
    webCamPane.setStyle("-fx-background-color: #ccc;");
    imgWebCamCapturedImage = new ImageView();
    webCamPane.setCenter(imgWebCamCapturedImage);
    root.setCenter(webCamPane);
    createTopPanel();
    bottomCameraControlPane = new FlowPane();
    bottomCameraControlPane.setOrientation(Orientation.HORIZONTAL);
    bottomCameraControlPane.setAlignment(Pos.CENTER);
    bottomCameraControlPane.setHgap(20);
    bottomCameraControlPane.setVgap(10);
    bottomCameraControlPane.setPrefHeight(40);
    bottomCameraControlPane.setDisable(true);
    createCameraControls();
    root.setBottom(bottomCameraControlPane);

    primaryStage.setScene(new Scene(root));
    primaryStage.setHeight(700);
    primaryStage.setWidth(600);
    primaryStage.centerOnScreen();
    primaryStage.show();

    Platform.runLater(new Runnable() {

        @Override
        public void run() {
            setImageViewSize();
        }
    });

}

protected void setImageViewSize() {

    double height = webCamPane.getHeight();
    double width = webCamPane.getWidth();

    imgWebCamCapturedImage.setFitHeight(height);
    imgWebCamCapturedImage.setFitWidth(width);
    imgWebCamCapturedImage.prefHeight(height);
    imgWebCamCapturedImage.prefWidth(width);
    imgWebCamCapturedImage.setPreserveRatio(true);

}

private void createTopPanel() {

    int webCamCounter = 0;
    Label lbInfoLabel = new Label("Select Your WebCam Camera");
    ObservableList<WebCamInfo> options = FXCollections.observableArrayList();

    topPane.getChildren().add(lbInfoLabel);

    for (Webcam webcam : Webcam.getWebcams()) {
        WebCamInfo webCamInfo = new WebCamInfo();
        webCamInfo.setWebCamIndex(webCamCounter);
        webCamInfo.setWebCamName(webcam.getName());
        options.add(webCamInfo);
        webCamCounter++;
    }

    ComboBox<WebCamInfo> cameraOptions = new ComboBox<WebCamInfo>();
    cameraOptions.setItems(options);
    cameraOptions.setPromptText(cameraListPromptText);
    cameraOptions.getSelectionModel().selectedItemProperty().addListener(new ChangeListener<WebCamInfo>() {

        @Override
        public void changed(ObservableValue<? extends WebCamInfo> arg0, WebCamInfo arg1, WebCamInfo arg2) {
            if (arg2 != null) {
                System.out.println("WebCam Index: " + arg2.getWebCamIndex() + ": WebCam Name:" + arg2.getWebCamName());
                initializeWebCam(arg2.getWebCamIndex());
            }
        }
    });
    topPane.getChildren().add(cameraOptions);
}

protected void initializeWebCam(final int webCamIndex) {

    Task<Void> webCamTask = new Task<Void>() {

        @Override
        protected Void call() throws Exception {

            if (webCam != null) {
                startWebCamCamera();
            }

            webCam = Webcam.getWebcams().get(webCamIndex);
            webCam.open();

            startWebCamStream();

            return null;
        }
    };

    Thread webCamThread = new Thread(webCamTask);
    webCamThread.setDaemon(true);
    webCamThread.start();

    bottomCameraControlPane.setDisable(false);
    btnCamreaStart.setDisable(true);
}

protected void startWebCamStream() {

    stopCamera = false;

    Task<Void> task = new Task<Void>() {

        @Override
        protected Void call() throws Exception {

            final AtomicReference<WritableImage> ref = new AtomicReference<>();
            BufferedImage img = null;

            while (!stopCamera) {
                try {
                    if ((img = webCam.getImage()) != null) {

                        ref.set(SwingFXUtils.toFXImage(img, ref.get()));
                        img.flush();

                        Platform.runLater(new Runnable() {

                            @Override
                            public void run() {
                                imageProperty.set(ref.get());
                            }
                        });
                    }
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }

            return null;
        }
    };

    Thread th = new Thread(task);
    th.setDaemon(true);
    th.start();
    imgWebCamCapturedImage.imageProperty().bind(imageProperty);

}

private void createCameraControls() {

    btnCamreaStop = new Button();
    btnCamreaStop.setOnAction(new EventHandler<ActionEvent>() {

        @Override
        public void handle(ActionEvent arg0) {

            stopWebCamCamera();
        }
    });
    btnCamreaStop.setText("Stop Camera");
    btnCamreaStart = new Button();
    btnCamreaStart.setOnAction(new EventHandler<ActionEvent>() {

        @Override
        public void handle(ActionEvent arg0) {
            startWebCamCamera();
        }
    });
    btnCamreaStart.setText("Start Camera");
    btnCameraRecord = new Button();
    btnCameraRecord.setText("Camera Record");
    btnCameraRecord.setOnAction(new EventHandler<ActionEvent>() {

        @Override
        public void handle(ActionEvent arg0) {
            try {
                recordWebCamCamera();
            } catch (Throwable e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
        }
    });
    bottomCameraControlPane.getChildren().add(btnCamreaStart);
    bottomCameraControlPane.getChildren().add(btnCamreaStop);
    bottomCameraControlPane.getChildren().add(btnCameraRecord);
}

protected void recordWebCamCamera() throws Throwable {

    /*RECORD THE VIDEO HERE*/
}

protected void startWebCamCamera() {
    stopCamera = false;
    startWebCamStream();
    btnCamreaStop.setDisable(false);
    btnCamreaStart.setDisable(true);
}

protected void stopWebCamCamera() {
    stopCamera = true;
    btnCamreaStart.setDisable(false);
    btnCamreaStop.setDisable(true);
}

public static void main(String[] args) {
    launch(args);
}

}

0 个答案:

没有答案
相关问题