|
@@ -92,67 +92,71 @@ public class VideoService {
|
|
parallelism = Integer.parseInt(customRedisClient.get(cpuNodeParallelismKey));
|
|
parallelism = Integer.parseInt(customRedisClient.get(cpuNodeParallelismKey));
|
|
TimeUnit.SECONDS.sleep(7);
|
|
TimeUnit.SECONDS.sleep(7);
|
|
}
|
|
}
|
|
- customRedisClient.set(cpuNodeParallelismKey, (parallelism - 1) + "");
|
|
|
|
|
|
+ String lockName = "video-lock-" + taskId;
|
|
|
|
+ customRedisClient.lock(lockName, Long.parseLong(maxSimulationTime) + 10L, 1000L);
|
|
|
|
+ customRedisClient.decrement(cpuNodeParallelismKey, 1);
|
|
|
|
+ try {
|
|
|
|
+ String rootDirectoryPathOfMinio = projectResultPathOfMinio + projectId + "/" + taskId + "/";
|
|
|
|
+ String xodrPathOfMinio = rootDirectoryPathOfMinio + taskId + ".xodr";
|
|
|
|
+ String osgbPathOfMinio = rootDirectoryPathOfMinio + taskId + ".osgb";
|
|
|
|
+ String csv1PathOfMinio = rootDirectoryPathOfMinio + csv1Name;
|
|
|
|
+ String csv2PathOfMinio = rootDirectoryPathOfMinio + csv2Name;
|
|
|
|
+ String rootDirectoryPathOfLinux = linuxTempPath + "video/" + projectId + "/" + taskId + "/";
|
|
|
|
+ String xodrPathOfLinux = rootDirectoryPathOfLinux + taskId + ".xodr";
|
|
|
|
+ String osgbPathOfLinux = rootDirectoryPathOfLinux + taskId + ".osgb";
|
|
|
|
+ String csv1PathOfLinux = rootDirectoryPathOfLinux + csv1Name;
|
|
|
|
+ String csv2PathOfLinux = rootDirectoryPathOfLinux + csv2Name;
|
|
|
|
+ log.info("下载 csv、xodr、osgb。");
|
|
|
|
+ MinioUtil.downloadToFile(minioClient, bucketName, xodrPathOfMinio, xodrPathOfLinux);
|
|
|
|
+ MinioUtil.downloadToFile(minioClient, bucketName, osgbPathOfMinio, osgbPathOfLinux);
|
|
|
|
+ MinioUtil.downloadToFile(minioClient, bucketName, csv1PathOfMinio, csv1PathOfLinux);
|
|
|
|
+ MinioUtil.downloadToFile(minioClient, bucketName, csv2PathOfMinio, csv2PathOfLinux);
|
|
|
|
|
|
|
|
+ log.info("生成 xosc 文件。");
|
|
|
|
+ String xoscPath = generateXosc(rootDirectoryPathOfLinux, xodrPathOfLinux, osgbPathOfLinux, projectId, projectType);
|
|
|
|
+ log.info("启动虚拟窗口并通过 esmini 截图。");
|
|
|
|
+ String pictureDirectoryPath = rootDirectoryPathOfLinux + "picture";
|
|
|
|
+ FileUtil.createDirectory(pictureDirectoryPath);
|
|
|
|
+ String esminiCommandTemp = esminiCommand + " " + xoscPath + " " + pictureDirectoryPath + "/screenshot " + StringUtil.doubleToString(Double.parseDouble(maxSimulationTime), 2);
|
|
|
|
+ LinuxUtil.execute(XvfbCommand);
|
|
|
|
+ LinuxUtil.execute(esminiCommandTemp);
|
|
|
|
+ log.info("删除 esmini 进程。");
|
|
|
|
+ LinuxUtil.kill(esminiCommandTemp);
|
|
|
|
+ int num = 14;
|
|
|
|
+ for (int i = 0; i < num; i++) {
|
|
|
|
+ String remove = "rm -f " + pictureDirectoryPath + "/screenshot_0000" + i + ".tga";
|
|
|
|
+ log.info("删除图片:" + remove);
|
|
|
|
+ LinuxUtil.execute(remove);
|
|
|
|
+ }
|
|
|
|
+ log.info("生成视频。");
|
|
|
|
+ String videoTargetPathOfLinux = rootDirectoryPathOfLinux + "video/" + videoName;
|
|
|
|
+ FileUtil.createParentDirectory(videoTargetPathOfLinux);
|
|
|
|
+ String videoTargetPathOfMinio = rootDirectoryPathOfMinio + videoName;
|
|
|
|
|
|
- String rootDirectoryPathOfMinio = projectResultPathOfMinio + projectId + "/" + taskId + "/";
|
|
|
|
- String xodrPathOfMinio = rootDirectoryPathOfMinio + taskId + ".xodr";
|
|
|
|
- String osgbPathOfMinio = rootDirectoryPathOfMinio + taskId + ".osgb";
|
|
|
|
- String csv1PathOfMinio = rootDirectoryPathOfMinio + csv1Name;
|
|
|
|
- String csv2PathOfMinio = rootDirectoryPathOfMinio + csv2Name;
|
|
|
|
- String rootDirectoryPathOfLinux = linuxTempPath + "video/" + projectId + "/" + taskId + "/";
|
|
|
|
- String xodrPathOfLinux = rootDirectoryPathOfLinux + taskId + ".xodr";
|
|
|
|
- String osgbPathOfLinux = rootDirectoryPathOfLinux + taskId + ".osgb";
|
|
|
|
- String csv1PathOfLinux = rootDirectoryPathOfLinux + csv1Name;
|
|
|
|
- String csv2PathOfLinux = rootDirectoryPathOfLinux + csv2Name;
|
|
|
|
- log.info("下载 csv、xodr、osgb。");
|
|
|
|
- MinioUtil.downloadToFile(minioClient, bucketName, xodrPathOfMinio, xodrPathOfLinux);
|
|
|
|
- MinioUtil.downloadToFile(minioClient, bucketName, osgbPathOfMinio, osgbPathOfLinux);
|
|
|
|
- MinioUtil.downloadToFile(minioClient, bucketName, csv1PathOfMinio, csv1PathOfLinux);
|
|
|
|
- MinioUtil.downloadToFile(minioClient, bucketName, csv2PathOfMinio, csv2PathOfLinux);
|
|
|
|
-
|
|
|
|
- log.info("生成 xosc 文件。");
|
|
|
|
- String xoscPath = generateXosc(rootDirectoryPathOfLinux, xodrPathOfLinux, osgbPathOfLinux, projectId, projectType);
|
|
|
|
- log.info("启动虚拟窗口并通过 esmini 截图。");
|
|
|
|
- String pictureDirectoryPath = rootDirectoryPathOfLinux + "picture";
|
|
|
|
- FileUtil.createDirectory(pictureDirectoryPath);
|
|
|
|
- String esminiCommandTemp = esminiCommand + " " + xoscPath + " " + pictureDirectoryPath + "/screenshot " + StringUtil.doubleToString(Double.parseDouble(maxSimulationTime), 2);
|
|
|
|
- LinuxUtil.execute(XvfbCommand);
|
|
|
|
- LinuxUtil.execute(esminiCommandTemp);
|
|
|
|
- log.info("删除 esmini 进程。");
|
|
|
|
- LinuxUtil.kill(esminiCommandTemp);
|
|
|
|
- int num = 14;
|
|
|
|
- for (int i = 0; i < num; i++) {
|
|
|
|
- String remove = "rm -f " + pictureDirectoryPath + "/screenshot_0000" + i + ".tga";
|
|
|
|
- log.info("删除图片:" + remove);
|
|
|
|
- LinuxUtil.execute(remove);
|
|
|
|
- }
|
|
|
|
- log.info("生成视频。");
|
|
|
|
- String videoTargetPathOfLinux = rootDirectoryPathOfLinux + "video/" + videoName;
|
|
|
|
- FileUtil.createParentDirectory(videoTargetPathOfLinux);
|
|
|
|
- String videoTargetPathOfMinio = rootDirectoryPathOfMinio + videoName;
|
|
|
|
-
|
|
|
|
- String execute = LinuxUtil.execute("ffmpeg"
|
|
|
|
- + " -f image2 -framerate 30 "
|
|
|
|
- + "-start_number " + num
|
|
|
|
- + " -i " + pictureDirectoryPath + "/screenshot_%05d.tga"
|
|
|
|
- + " -c:v libx264 -vf format=yuv420p -crf 20 "
|
|
|
|
- + videoTargetPathOfLinux
|
|
|
|
- );
|
|
|
|
- //6 将视频上传到 minio
|
|
|
|
- MinioUtil.uploadFromFile(minioClient, videoTargetPathOfLinux, bucketName, videoTargetPathOfMinio);
|
|
|
|
- log.info("上传成功:" + videoTargetPathOfMinio);
|
|
|
|
- //删除生成的临时文件
|
|
|
|
- String removeAll = "rm -rf " + pictureDirectoryPath;
|
|
|
|
- log.info("删除全部图片==" + removeAll);
|
|
|
|
|
|
+ String execute = LinuxUtil.execute("ffmpeg"
|
|
|
|
+ + " -f image2 -framerate 30 "
|
|
|
|
+ + "-start_number " + num
|
|
|
|
+ + " -i " + pictureDirectoryPath + "/screenshot_%05d.tga"
|
|
|
|
+ + " -c:v libx264 -vf format=yuv420p -crf 20 "
|
|
|
|
+ + videoTargetPathOfLinux
|
|
|
|
+ );
|
|
|
|
+ //6 将视频上传到 minio
|
|
|
|
+ MinioUtil.uploadFromFile(minioClient, videoTargetPathOfLinux, bucketName, videoTargetPathOfMinio);
|
|
|
|
+ log.info("上传成功:" + videoTargetPathOfMinio);
|
|
|
|
+ //删除生成的临时文件
|
|
|
|
+ String removeAll = "rm -rf " + pictureDirectoryPath;
|
|
|
|
+ log.info("删除全部图片==" + removeAll);
|
|
|
|
+ LinuxUtil.execute(removeAll);
|
|
|
|
+ //* -------------------------------- 删除临时文件 --------------------------------
|
|
// FileUtil.rm(xodrPathOfLinux);
|
|
// FileUtil.rm(xodrPathOfLinux);
|
|
// FileUtil.rm(osgbPathOfLinux);
|
|
// FileUtil.rm(osgbPathOfLinux);
|
|
// FileUtil.rm(csv1PathOfLinux);
|
|
// FileUtil.rm(csv1PathOfLinux);
|
|
// FileUtil.rm(csv2PathOfLinux);
|
|
// FileUtil.rm(csv2PathOfLinux);
|
|
|
|
|
|
- //* -------------------------------- 删除临时文件 --------------------------------
|
|
|
|
- LinuxUtil.execute(removeAll);
|
|
|
|
- customRedisClient.set(cpuNodeParallelismKey, (Integer.parseInt(customRedisClient.get(cpuNodeParallelismKey)) + 1) + "");
|
|
|
|
|
|
+ } finally {
|
|
|
|
+ customRedisClient.decrement(cpuNodeParallelismKey, 1);
|
|
|
|
+ customRedisClient.unlock(lockName);
|
|
|
|
+ }
|
|
}
|
|
}
|
|
|
|
|
|
/**
|
|
/**
|