(JAVA)图像转视频

该博客介绍了如何利用Maven引入JavaCV库,将一系列图片转换成视频并保存到数据库的过程。首先,删除已存在的旧文件,然后创建新的文件列表,并将图片移动到指定目录。接着,利用JavaCV合成MP4视频,同时保存图片的元数据到数据库。如果在生成视频过程中出现异常,则返回错误信息。
  • maven引包
 <!--图片转视频依赖-->
        <dependency>
            <groupId>org.bytedeco</groupId>
            <artifactId>javacv</artifactId>
            <version>1.5.2</version>
        </dependency>
        <dependency>
            <groupId>org.bytedeco</groupId>
            <artifactId>javacv-platform</artifactId>
            <version>1.5.2</version>
        </dependency>
  • 实列代码
 /**
     * @return com.nwpusct.csal.common.util.RestResult<java.lang.String>
     * @Author HB
     * @Date 2020/10/14 16:44
     **/
    @ApiOperation(value = "保存数据到数据库")
    @PostMapping("/fileToDataSave")
    public RestResult<String> fileToDataSave(@RequestBody DatagoMv createMp4
    ) {
        if (StringUtils.isNotEmpty(createMp4.getId())) {
            String mvPath = createMp4.getMvPath();
            File f = new File(mvPath);
            f.delete();
            ndeFileServerService.deleteByMvId(createMp4.getId());
        }
        String locaPath = null;
        //文件保存集合
        List<File> fileList = new ArrayList<>();
        DatagoMv dm = new DatagoMv();
        dm.setId(StringUtils.createUUID());
        dm.setCreateTime(new Date());
        dm.setFileId(createMp4.getFileId());
        NdeUploadFile ndeUploadFile = ndeUploadFileService.ndeUploadById(createMp4.getFileId());
        int i=0;
        List<NdeFileServer> fileServerList = new ArrayList<>();
        for (ImageData strList : createMp4.getFrameList()
        ) {
            String filePath = strList.getImageUrl().replaceAll(httpPath, createPath.split("/")[0]);
            String userId = filePath.split("/")[3];
            String batch = filePath.split("/")[4];
            NdeFileServer nfs = new NdeFileServer();
            nfs.setId(StringUtils.createUUID());
            nfs.setCreateTime(new Date());
            nfs.setImportNum(i++);
            nfs.setUserId(userId);
            nfs.setBatch(batch);

            nfs.setMvId(dm.getId());
            nfs.setIsKeyFrame(strList.getIsKeyFrame());
            //移动文件
            File vueFile = new File(filePath);
            locaPath = createPath + "/" + ndeUploadFile.getDirUrl();
            File locaFile = new File(locaPath);
            if (!locaFile.exists()) {
                locaFile.mkdirs();
            }
            //要移动得文件路径
            String newFile = locaPath + "/" + vueFile.getName();
            nfs.setFilePath(newFile);
            File file = new File(newFile);
            //移动文件
            //vueFile.renameTo(file);
            try {
                copyFile(vueFile, file);
                fileList.add(new File(newFile));
            } catch (IOException e) {
                e.printStackTrace();
                return RestResultUtil.failed("生成视频异常");
            }
            nfs.setHttpUrl(httpPath + newFile.replaceAll(newFile.split("/")[0], ""));
            fileServerList.add(nfs);
        }
        //合成的MP4
        String mp4SavePath = locaPath + "/" + createMp4.getName() + ".mp4";
        Map<Integer, File> imgMap = new HashMap<Integer, File>();
        int num = 0;
        for (File imgFile : fileList) {
            imgMap.put(num, imgFile);
            num++;
        }
        try {
            //视频生成
            FileUtil.createMp4(mp4SavePath, imgMap, createMp4.getWidth(), createMp4.getHeight(),
                    createMp4.getFps());
            //批量增加
            ndeFileServerService.insertBatchSelective(fileServerList);
            //视频添加
            dm.setHeight(createMp4.getHeight());
            dm.setMvHttp(httpPath + mp4SavePath.replaceAll(mp4SavePath.split("/")[0], ""));
            dm.setMvPath(mp4SavePath);
            dm.setFps(createMp4.getFps());
            dm.setWidth(createMp4.getWidth());
            dm.setName(createMp4.getName()+ ".mp4");
            datagoMvService.insertSelective(dm);
            return RestResultUtil.genSuccessResult(dm.getId());
        } catch (FrameRecorder.Exception e) {
            e.printStackTrace();
        }
        return RestResultUtil.failed();
    }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值