通过获取RGB值,使用ffmpeg生成RGB颜色的视频

前台获取数据

第一步从前台获取需要用到的数据,包括节目名称,帧率,亮度,RGB的值。 后台拿到数据需要先对文件名称进行校验,如节目名称已存在则直接抛出异常,就不需要进行生成图片等操作,提高系统效率。

ObjAnimationInfo objAnimationInfo = new ObjAnimationInfo();
        objAnimationInfo.setName(animationVo.getProgramName());
        objAnimationInfo.setDeviceId(animationVo.getDeviceId());
        ObjAnimationInfo item = objNodeStateMapper.findByNameAndDeviceId(objAnimationInfo.getName(),objAnimationInfo.getDeviceId());
        if (item != null){
          
   
            throw new CustomException("节目名称已存在");
        }

生成图片

生成图片时需要临时存放图片的一个路径,和图片的宽高(图片尺寸也可从前台获取),以及从前台获取的RGB值, 使用ImageUtils中的colorImage方法即可

//生成图片的工具类中的方法
    public static String colorImage(int r,int g,int b,int width,int height,String path){
          
   
        BufferedImage bufferedImage = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB);
        Graphics2D graphics2d=(Graphics2D) bufferedImage.getGraphics();

        graphics2d.setBackground(Color.WHITE);
        graphics2d.clearRect(0, 0, width, height);
        graphics2d.setPaint(new Color(r,g,b));
        graphics2d.fillRect(0, 0, width, height);

        String rgbString= "r" + r + "g" + g + "b" + b + System.currentTimeMillis(); //图片命名
        String filePath=path + rgbString +".png";
        File file = new File(filePath);
        try {
          
   
            ImageIO.write(bufferedImage, "png", file);
        } catch (IOException e) {
          
   
            e.printStackTrace();
        }
        return filePath;
    }

生成视频

生成视频时需要视频存放的临时路径,和之前生成的图片的路径,然后通过Ffmpeg生成视频

String targetFile = TEMP_PATH + System.currentTimeMillis() + "convert." + EXTENSION_MP4;
        String[] inputArgs = {
          
   "-r","25","-loop","1"};//-i之前的命令
        //ffmpeg  -r 25 -loop 1   -i    ./a.bmp     -pix_fmt yuv420p -vcodec libx264 -b:v 600k -r:v 25 -preset medium -crf 30 -vframes 250 -r 25 -t 10     ./a.mp4
        String[] outputArgs = {
          
   "-pix_fmt","yuv420p","-vcodec","libx264","-b:v","600k","-r:v","25","-preset","medium","-crf","30","-vframes","250","-r","25","-t","30"}; //-i之后的命令
        try {
          
   
            FfmpegUtil.convert(FFMPEG,FFPROBE,imgPath,targetFile,inputArgs,outputArgs);
        } catch (IOException e) {
          
   
            e.printStackTrace();
        }

上传ftp

需要将视频上传ftp可以进行这一步操作,不需要上传则直接将生成视频的临时路径存入数据库 首先通过ftp工具类,连接到ftp 然后需要一个ftp中存放视频的路径,和文件名,然后将视频流进行上传

FTPClient ftpClient = FtpUtil.connectFtpServer(FTP_IP, FTP_PORT, FTP_USERNAME, FTP_PASSWORD, "utf-8");
            ftpClient.enterLocalPassiveMode();
            charset(ftpClient);
            File ftpFile = new File(targetFile);
            in = new FileInputStream(ftpFile);
            fileName = System.currentTimeMillis() + "animation." + EXTENSION_MP4;//文件命名
            boolean flag = ftpClient.storeFile(ANIMATION_PATH + fileName, in);

视频数据存入数据库

存入数据库就很简单,构造一个实体类,将需要的数据set进实体类中,通过inset存入数据库即可

删除临时文件

//删除指定路径的文件
    public static void delFile(String filePathAndName) {
          
   
        try {
          
   
            String filePath = filePathAndName;
            filePath = filePath.toString();
            java.io.File myDelFile = new java.io.File(filePath);
            myDelFile.delete();
        } catch (Exception e) {
          
   
            System.out.println("删除文件操作出错");
            e.printStackTrace();
        }
    }

通过删除指定路径中的文件的方法,如果不上传ftp,则只需要删除临时图片的文件,上传了ftp则需要删除临时图片和临时视频

经验分享 程序员 微信小程序 职场和发展