Просмотр исходного кода

修改调试模板视频功能

syh 5 лет назад
Родитель
Сommit
7701197409

+ 4 - 2
jeecg-boot-module-system/src/main/java/org/jeecg/modules/opencv/controller/ModelVideoInfoConfigController.java

@@ -7,9 +7,11 @@ import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import io.swagger.annotations.Api;
 import io.swagger.annotations.ApiOperation;
 import lombok.extern.slf4j.Slf4j;
+import org.apache.shiro.SecurityUtils;
 import org.jeecg.common.api.vo.Result;
 import org.jeecg.common.aspect.annotation.AutoLog;
 import org.jeecg.common.system.query.QueryGenerator;
+import org.jeecg.common.system.vo.LoginUser;
 import org.jeecg.modules.opencv.entity.ModelVideoInfoConfig;
 import org.jeecg.modules.opencv.service.IFfmpegService;
 import org.jeecg.modules.opencv.service.IModelVideoInfoConfigService;
@@ -62,8 +64,8 @@ public class ModelVideoInfoConfigController {
 
     @RequestMapping("/videoMerge")
     public Map<String, Object> videoMerge(@RequestBody JSONObject data) {
-        System.out.println(data.toJSONString());
-        return ffmpegService.videoMerge(data);
+        LoginUser user = (LoginUser) SecurityUtils.getSubject().getPrincipal();
+        return ffmpegService.videoMerge(data, user.getId());
     }
 
     @Autowired

+ 17 - 3
jeecg-boot-module-system/src/main/java/org/jeecg/modules/opencv/entity/ModelVideoCompositeInfo.java

@@ -29,9 +29,9 @@ public class ModelVideoCompositeInfo {
     /**
      * id
      */
-    @TableId(type = IdType.UUID)
+    @TableId(type = IdType.AUTO)
     @ApiModelProperty(value = "id")
-    private Integer id;
+    private Long id;
     /**
      * videoUrl
      */
@@ -43,7 +43,7 @@ public class ModelVideoCompositeInfo {
      */
     @Excel(name = "模板id", width = 15)
     @ApiModelProperty(value = "模板id")
-    private Integer modelId;
+    private Long modelId;
     /**
      * userId
      */
@@ -60,4 +60,18 @@ public class ModelVideoCompositeInfo {
      */
     @ApiModelProperty(value = "updateTime")
     private Date updateTime;
+
+    private Integer sizeType;
+
+    public ModelVideoCompositeInfo(String userId, ModelVideoInfo videoInfo, String finalUrl) {
+        this.userId = userId;
+        this.modelId = videoInfo.getId();
+        this.videoUrl = finalUrl;
+        this.sizeType = videoInfo.getSizeType();
+        this.createTime = new Date();
+        this.updateTime = new Date();
+    }
+
+    public ModelVideoCompositeInfo() {
+    }
 }

+ 1 - 1
jeecg-boot-module-system/src/main/java/org/jeecg/modules/opencv/service/IFfmpegService.java

@@ -15,5 +15,5 @@ public interface IFfmpegService {
 
     void mergeImageToVideo(String imagePath, Integer frameNumber, String videoFilePath);
 
-    Map<String, Object> videoMerge(JSONObject data);
+    Map<String, Object> videoMerge(JSONObject data, String userId);
 }

+ 76 - 12
jeecg-boot-module-system/src/main/java/org/jeecg/modules/opencv/service/impl/FfmpegServiceImpl.java

@@ -3,9 +3,11 @@ package org.jeecg.modules.opencv.service.impl;
 import cn.com.ctop.common.module.utils.*;
 import com.alibaba.fastjson.JSONObject;
 import lombok.extern.slf4j.Slf4j;
+import org.jeecg.modules.opencv.entity.ModelVideoCompositeInfo;
 import org.jeecg.modules.opencv.entity.ModelVideoInfo;
 import org.jeecg.modules.opencv.entity.ModelVideoInfoConfig;
 import org.jeecg.modules.opencv.service.IFfmpegService;
+import org.jeecg.modules.opencv.service.IModelVideoCompositeInfoService;
 import org.jeecg.modules.opencv.service.IModelVideoInfoConfigService;
 import org.jeecg.modules.opencv.service.IModelVideoInfoService;
 import org.jeecg.modules.opencv.utils.ImageUtils;
@@ -19,9 +21,7 @@ import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.beans.factory.annotation.Value;
 import org.springframework.stereotype.Service;
 
-import java.io.File;
-import java.io.FileInputStream;
-import java.io.InputStream;
+import java.io.*;
 import java.math.BigDecimal;
 import java.math.RoundingMode;
 import java.util.ArrayList;
@@ -156,8 +156,55 @@ public class FfmpegServiceImpl implements IFfmpegService {
             builder.command(command);
             builder.redirectErrorStream(true);
             Process process = builder.start();
+            //获取进程的标准输入流
+            final InputStream is1 = process.getInputStream();
+            //获取进城的错误流
+            final InputStream is2 = process.getErrorStream();
+            //启动两个线程,一个线程负责读标准输出流,另一个负责读标准错误流
+            new Thread() {
+                public void run() {
+                    BufferedReader br1 = new BufferedReader(new InputStreamReader(is1));
+                    try {
+                        String line1 = null;
+                        while ((line1 = br1.readLine()) != null) {
+                            if (line1 != null) {
+                            }
+                        }
+                    } catch (IOException e) {
+                        e.printStackTrace();
+                    } finally {
+                        try {
+                            is1.close();
+                        } catch (IOException e) {
+                            e.printStackTrace();
+                        }
+                    }
+                }
+            }.start();
+
+            new Thread() {
+                public void run() {
+                    BufferedReader br2 = new BufferedReader(new InputStreamReader(is2));
+                    try {
+                        String line2 = null;
+                        while ((line2 = br2.readLine()) != null) {
+                            if (line2 != null) {
+                            }
+                        }
+                    } catch (IOException e) {
+                        e.printStackTrace();
+                    } finally {
+                        try {
+                            is2.close();
+                        } catch (IOException e) {
+                            e.printStackTrace();
+                        }
+                    }
+                }
+            }.start();
             // 等待进程执行结束
             process.waitFor();
+            process.destroy();
             log.info("ffmpeg命令执行完成");
         } catch (Exception e) {
             e.printStackTrace();
@@ -165,7 +212,7 @@ public class FfmpegServiceImpl implements IFfmpegService {
     }
 
     @Override
-    public Map<String, Object> videoMerge(JSONObject data) {
+    public Map<String, Object> videoMerge(JSONObject data, String userId) {
         Map<String, Object> result = new HashMap<>();
         try {
             Long modelId = data.getLong("modelId");
@@ -181,7 +228,7 @@ public class FfmpegServiceImpl implements IFfmpegService {
             }
             //1:
             url = "https:" + url;
-            String getUrl = mergeVideo(videoInfo, url);
+            String getUrl = mergeVideo(videoInfo, url, userId);
             ResultMapUtils.setResultMap(result, StatusCode.COMMON_SUCCESS);
             result.put("url", getUrl);
             return result;
@@ -195,17 +242,17 @@ public class FfmpegServiceImpl implements IFfmpegService {
     @Autowired
     private IModelVideoInfoConfigService configService;
 
-    private String mergeVideo(ModelVideoInfo videoInfo, String url) throws Exception {
+    private String mergeVideo(ModelVideoInfo videoInfo, String url, String userId) throws Exception {
+        Long current = System.currentTimeMillis();
         System.loadLibrary(Core.NATIVE_LIBRARY_NAME);
         //根据url下载视频
-        String srcVideoPath = PropertiesUtils.getValue("kuaishou_config", "model_video_src_path_test");
-        String fillVideoPath = PropertiesUtils.getValue("kuaishou_config", "model_video_fill_path_test");
-        String finalVideoPath = PropertiesUtils.getValue("kuaishou_config", "model_video_final_path_test");
+        String srcVideoPath = PropertiesUtils.getValue("kuaishou_config", "model_video_src_path");
+        String fillVideoPath = PropertiesUtils.getValue("kuaishou_config", "model_video_fill_path");
+        String finalVideoPath = PropertiesUtils.getValue("kuaishou_config", "model_video_final_path");
 
         String fillFilePath = LoadFileUtil.downLoadFromUrl(url, fillVideoPath);
         String srcFilePath = LoadFileUtil.downLoadFromUrl(videoInfo.getModelVideoUrl(), srcVideoPath);
 
-        Long current = System.currentTimeMillis();
         String splitSrcPath = srcVideoPath + current + File.separator;
         String splitFillPath = fillVideoPath + current + File.separator;
         String splitFinalPath = finalVideoPath + current + File.separator;
@@ -289,9 +336,15 @@ public class FfmpegServiceImpl implements IFfmpegService {
             String finalVideoFilePath = splitSrcPath + "final.mp4";
             mergeAudioAndVideo(noVoiceVideoFilePath, finalM4aFilePath, finalVideoFilePath);
             //3.6 上传视频文件至OSS并返回url存入数据库
-            InputStream inputStream = new FileInputStream(finalM4aFilePath);
-            String finalUrl = OSSUtils.uploadFile2OSS(inputStream, "/model/final/", videoInfo.getTitle() + current + ".mp4");
+            InputStream inputStream = new FileInputStream(finalVideoFilePath);
+            String finalUrl = OSSUtils.uploadFile2OSS(inputStream, "model/final/", videoInfo.getId() + "_" + current + ".mp4");
             System.out.println(finalUrl);
+            ModelVideoCompositeInfo compositeInfo = new ModelVideoCompositeInfo(userId, videoInfo, finalUrl);
+            compositeInfoService.saveOrUpdate(compositeInfo);
+            //删除文件
+            deleteFile(splitSrcPath, splitFillPath, splitFinalPath, srcFilePath, fillFilePath);
+            log.info("视频合成成功:总时长{}毫秒", System.currentTimeMillis() - current);
+            return finalUrl;
         } else if (config.getType() == 2) {
             //2:合并图片
 
@@ -301,6 +354,17 @@ public class FfmpegServiceImpl implements IFfmpegService {
         return null;
     }
 
+    private void deleteFile(String splitSrcPath, String splitFillPath, String splitFinalPath, String srcFilePath, String fillFilePath) {
+        LoadFileUtil.delFile(splitFillPath);
+        LoadFileUtil.delFile(splitSrcPath);
+        LoadFileUtil.delFile(splitFinalPath);
+        LoadFileUtil.delFile(srcFilePath);
+        LoadFileUtil.delFile(fillFilePath);
+    }
+
+    @Autowired
+    private IModelVideoCompositeInfoService compositeInfoService;
+
     private String getSecond(int exchangeStartFrameNum) {
         BigDecimal second = new BigDecimal(exchangeStartFrameNum).divide(new BigDecimal("25"), 3, RoundingMode.HALF_UP);
         if (second.compareTo(new BigDecimal("10")) < 0) {

+ 2 - 2
jeecg-boot-module-system/src/main/resources/application-prod.yml

@@ -142,8 +142,8 @@ mybatis-plus:
 #jeecg专用配置
 jeecg:
   ffmpeg:
-    #    bin: /mnt/ffmpeg/bin
-    bin: D:\java\ffmpeg\bin\ffmpeg.exe
+    bin: ffmpeg
+  #    bin: D:\java\ffmpeg\bin\ffmpeg.exe
   path:
     #文件上传根目录 设置
     upload: /mnt/upload

+ 1 - 1
jeecg-boot-module-system/src/test/java/org/jeecg/SampleTest.java

@@ -303,7 +303,7 @@ public class SampleTest {
     @Test
     public void test() throws Exception {
         InputStream file = new FileInputStream("D:\\data\\模板视频\\原始模板4.mp4");
-        OSSUtils.uploadFile2OSS(file, "/model/video/", "123.mp4");
+        OSSUtils.uploadFile2OSS(file, "model/video/", "1234.mp4");
     }
 
 

+ 1 - 2
module-common/src/main/java/cn/com/ctop/common/module/utils/OSSUtils.java

@@ -222,10 +222,9 @@ public class OSSUtils {
             objectMetadata.setHeader("Pragma", "no-cache");
             objectMetadata.setContentType(getContentType(remoteFileName));
             objectMetadata.setContentDisposition("inline;filename=" + remoteFileName);
-            createFolder(bucketName, folder);
             // 上传文件
             ossClient.putObject(bucketName, folder + remoteFileName, instream, objectMetadata);
-            return folder + remoteFileName;
+            return "https://ctop-media.oss-cn-beijing.aliyuncs.com/" + folder + remoteFileName;
         } catch (IOException e) {
             logger.error(e.getMessage(), e);
         } finally {

+ 3 - 3
module-kuaishou/src/main/resources/kuaishou_config.properties

@@ -10,11 +10,11 @@ apk_sava_path=/mnt/file/apk
 image_sava_path=/mnt/file/image
 video_sava_path=/mnt/file/video
 ## 模板视频存放路径
-model_video_src_path=/mnt/file/model/video/src/
+model_video_src_path=/mnt/data/src/
 ## 片段合成视频存放路径
-model_video_fill_path=/mnt/file/model/video/fill/
+model_video_fill_path=/mnt/data/fill/
 ##
-model_video_final_path=/mnt/file/model/video/final/
+model_video_final_path=/mnt/data/final/
 ## 模板视频存放路径
 model_video_src_path_test=D:\\data\\model\\src\\
 ## 片段合成视频存放路径