package com.xxb;
import java.awt.Desktop;
import java.io.File;
import java.text.SimpleDateFormat;
import java.util.Date;
import javax.sound.sampled.AudioFormat;
import javax.sound.sampled.AudioSystem;
import javax.sound.sampled.DataLine;
import javax.sound.sampled.TargetDataLine;
import javax.swing.filechooser.FileSystemView;
import javafx.application.Application;
import javafx.application.Platform;
import javafx.event.EventHandler;
import javafx.geometry.Insets;
import javafx.geometry.Pos;
import javafx.geometry.Rectangle2D;
import javafx.scene.Scene;
import javafx.scene.control.Alert;
import javafx.scene.control.Button;
import javafx.scene.control.Label;
import javafx.scene.control.Tooltip;
import javafx.scene.image.Image;
import javafx.scene.image.ImageView;
import javafx.scene.input.MouseEvent;
import javafx.scene.layout.Pane;
import javafx.scene.layout.StackPane;
import javafx.scene.paint.Color;
import javafx.scene.text.Font;
import javafx.scene.text.FontWeight;
import javafx.stage.Screen;
import javafx.stage.Stage;
import javafx.stage.StageStyle;
public class VideoScreenRecordApplication extends Application{
//窗体的大小
private static final int WIDTH = 240;
private static final int HEIGHT = 70;
private String DEFAULT_FILE_PATH = ""; // 默认存放路径
private Label lblTime = null;
private VideoRecord video = null; // 录屏
// 计数线程
private CountingThread thread = null;
// 记录程序开始时间
private long programStart = 0;
// 程序一开始就是暂停的
private long pauseStart = 0;
// 程序暂停的总时间
private long pauseCount = 0;
private String currentFilePath = ""; // 当前路径
private double xOffset = 0;
private double yOffset = 0;
private Stage stage = null;
private Stage primaryStage = null;
private boolean isHaveDevice = false; // 是否有录音设备
public void show() {
FileSystemView fsv = FileSystemView.getFileSystemView();
File desktop = fsv.getHomeDirectory();
DEFAULT_FILE_PATH = desktop.getPath() + "\\recordVideo\\";
primaryStage = new Stage();
String style = "-fx-background-color:#00000000";
/******* 分割线:设置弹出窗的一些样式 ***********/
primaryStage.initStyle(StageStyle.TRANSPARENT); // 设置弹出窗为透明
Rectangle2D primaryScreenBounds = Screen.getPrimary().getVisualBounds();
primaryStage.setX(primaryScreenBounds.getWidth() - WIDTH);
primaryStage.setY(primaryScreenBounds.getHeight() - HEIGHT);
primaryStage.setAlwaysOnTop(true);
primaryStage.setWidth(WIDTH);
primaryStage.setHeight(HEIGHT);
// primaryStage.getIcons().add(new Image(Constants.Logo));
/******* 分割线:设置弹出窗的一些样式 ***********/
Button start = new Button(""); // 开始按钮
Button play = new Button(""); // 播放按钮
Button close = new Button(""); // 关闭弹窗
/******* 分割线:设置开始录课按钮的一些样式 ********/
start.setTooltip(new Tooltip("录课"));
start.setGraphic(new ImageView(new Image("res/images/record/record.png")));
start.setLayoutX(5);
start.setLayoutY(1);
start.setStyle(style);
/******* 分割线:设置开始录课按钮的一些样式 ********/
/******** 分割线:设置播放按钮的一些样式 *********/
play.setTooltip(new Tooltip("播放"));
play.setGraphic(new ImageView(new Image("res/images/record/play.png")));
play.setLayoutX(48);
play.setLayoutY(1);
play.setStyle(style);
/******** 分割线:设置播放按钮的一些样式 *********/
/********** 分割线:设置关闭按钮的一些样式 ********/
close.setTooltip(new Tooltip("关闭"));
close.setGraphic(new ImageView(new Image("res/images/record/cancle.png")));
close.setLayoutX(90);
close.setLayoutY(1);
close.setStyle(style);
/********** 分割线:设置关闭按钮的一些样式 ********/
// 开始录课
start.setOnAction(e -> {
start();
});
// 调用播放器播放视频
play.setOnAction(e -> {
try {
Desktop.getDesktop().open(new File(currentFilePath + ".mp4"));
// System.gc();
} catch (Exception e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
Platform.runLater(() -> {
Alert alert = new Alert(Alert.AlertType.ERROR);
alert.setContentText("没有可播放的音视频!");
alert.show();
});
}
});
// 关闭
close.setOnAction(e -> {
primaryStage.close();
});
StackPane stackPane = new StackPane();
stackPane.setPrefSize(WIDTH, HEIGHT);
Pane paneBottom = new Pane();
paneBottom.setPrefSize(WIDTH, HEIGHT - 40);
paneBottom.setStyle("-fx-background-color:#89D1AC;");
Image image = new Image("res/images/record/class.png");
ImageView lblClass = new ImageView(image);
lblClass.setLayoutX(8);
lblClass.setLayoutY(10);
paneBottom.getChildren().add(lblClass);
Pane paneButton = new Pane();
paneButton.setPrefSize(130, 30);
paneButton.setStyle("-fx-background-color:#ffffff;");
paneButton.setLayoutX(45);
paneButton.setLayoutY(8);
paneButton.getChildren().addAll(start, play, close);
paneBottom.getChildren().add(paneButton);
stackPane.setStyle(style);
stackPane.getChildren().add(paneBottom);
stackPane.setMargin(paneBottom, new Insets(30, 0, 0, 0));
stackPane.setAlignment(paneBottom, Pos.TOP_LEFT);
ImageView logo = new ImageView(new Image("res/images/record/logo.jpg"));
logo.setFitHeight(50);
logo.setFitWidth(50);
stackPane.getChildren().add(logo);
stackPane.setAlignment(logo, Pos.TOP_RIGHT);
stackPane.setMargin(logo, new Insets(10, 0, 0, 0));
Scene scene = new Scene(stackPane);
scene.setFill(null);
primaryStage.setScene(scene);
primaryStage.show();
}
public void start(){//启动录播
isHaveDevice = isHaveDevice();
thread = new CountingThread();
thread.start();
programStart = System.currentTimeMillis();
pauseStart = programStart;
File directory = new File(DEFAULT_FILE_PATH);
if (!(directory.exists()) && !directory.isDirectory()) {
directory.mkdirs();
}
SimpleDateFormat df = new SimpleDateFormat("yyyyMMddHHmmss");// 设置日期格式
currentFilePath = DEFAULT_FILE_PATH + df.format(new Date());
pauseCount += (System.currentTimeMillis() - pauseStart);
video = new VideoRecord(currentFilePath, isHaveDevice);
showCountTime();
stage.show();
primaryStage.hide();
video.start();
thread.stopped = false;
}
/**
* 判断是否有录音设备
*
* @return true or false
*/
public Boolean isHaveDevice() {
Boolean result = false;
AudioFormat audioFormat = new AudioFormat(44100.0F, 16, 2, true, false);
DataLine.Info dataLineInfo = new DataLine.Info(TargetDataLine.class, audioFormat);
try {
TargetDataLine line = (TargetDataLine) AudioSystem.getLine(dataLineInfo);
result = true;
line.stop();
line.close();
} catch (Exception e1) {
// TODO Auto-generated catch block
result = false;
}
return result;
}
/**
* 点击开始后弹出的计时面板
*/
private void showCountTime() {
String style = "-fx-background-color:#00000000";
Rectangle2D primaryScreenBounds = Screen.getPrimary().getVisualBounds();
stage = new Stage();
stage.setAlwaysOnTop(true);
stage.setWidth(165);
stage.setHeight(35);
stage.setX(primaryScreenBounds.getWidth() - 165);
stage.setY(primaryScreenBounds.getHeight() - 35);
stage.initStyle(StageStyle.TRANSPARENT);
Button btnStartOrPuash = new Button("");
btnStartOrPuash.setTooltip(new Tooltip("暂停"));
btnStartOrPuash.setGraphic(new ImageView(new Image("res/images/record/puash.png")));
btnStartOrPuash.setLayoutX(0);
btnStartOrPuash.setLayoutY(4);
btnStartOrPuash.setStyle(style);
lblTime = new Label("00:00:00");
lblTime.setFont(Font.font("KaiTi", FontWeight.BOLD, 16));
lblTime.setTextFill(Color.BLACK);
lblTime.setLayoutX(50);
lblTime.setLayoutY(5);
lblTime.setPrefSize(80, 25);
Button btnStop = new Button("");
btnStop.setTooltip(new Tooltip("停�