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

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
敬告:该系列的课程在抓紧录制更新中,敬请大家关注。敬告:本课程项目仅供学习参考,请不要直接商用,概不负责任何法律责任。 该系列的课程涉及:FFmpeg,WebRTC,SRS,Nginx,Darwin,Live555,等。包括:音视频、流媒体、直播、Android、视频监控28181、等。 我将带领大家一起来学习使用FFmpeg开发视频监控项目,并动手操练。具体内容包括: 一、视频监控的架构和流程二、FFmpeg4.3+SDL2+Qt5开发环境的搭建三、FFmpeg的SDK编程回顾总结并操练四、SDL2.0的编程回顾总结并操练五、颜色空间转换RGB和YUV的原理与实战六、Qt5+FFmpeg本地摄像头采集预览实战七、代码封装:摄像头h264/5编码并存储八、Qt5+FFmpeg单路网络摄像头采集预览九、Qt5+FFmpeg单路网络摄像头采集预览录制会看十、onvif与GB/T-28181的简介  音视频与流媒体是一门很复杂的技术,涉及的概念、原理、理论非常多,很多初学者不学 基础理论,而是直接做项目,往往会看到c/c++的代码时一头雾水,不知道代码到底是什么意思,这是为什么呢?   因为没有学习音视频和流媒体的基础理论,就比如学习英语,不学习基本单词,而是天天听英语新闻,总也听不懂。 所以呢,一定要认真学习基础理论,然后再学习播放器、转码器、非编、流媒体直播、视频监控、等等。   梅老师从事音视频与流媒体行业18年;曾在永新视博、中科大洋、百度、美国Harris广播事业部等公司就职,经验丰富;曾亲手主导广电直播全套项目,精通h.264/h.265/aac,曾亲自参与百度app上的网页播放器等实战产品。  目前全身心自主创业,主要聚焦音视频+流媒体行业,精通音视频加密、流媒体在线转码快编等热门产品。  

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值