通过获取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则需要删除临时图片和临时视频