zoukankan      html  css  js  c++  java
  • JAVA生成视频缩略图的两种方式

    最近工作中遇到一个需求:在视频上传的时候截取视频图片。就调研了两种方法,亲测有效~~~

    方式一:使用ffmpng工具

    一、ffmpng工具的安装

    1.官网http://www.ffmpeg.org/download.html下载windows版本

    2.下载完成并解压后,设置环境变量

    3.dos窗口输入 ffmpeg -version  命令,测试是否成功;

    以上就是ffmpng工具的安装过程,下面就一起进入正题吧~

    二、视频截图的实现

    1.配置文件:新建一个bat文件,文件内容如下图

    解释一下个别参数的意思吧

    D:/ffmpeg/bin/ffmpeg.exe   工具所在的具体位置

    -ss 后面的数值代表截取多上秒后的图片(注意:小于视频的时间长度)

    2.java的实现

    public class ImageTest {
        @Test
        public void save() throws Exception {
            //视频文件
            String videoRealPath = "E:\test\FFOutput\1.mp4";
    
            //截图的路径(输出路径)
            String imageRealPath ="E://a.jpg";
    
            try {
    
                //调用批处理文件
                Runtime.getRuntime().exec("cmd /c start D://ffmpeg//ffmpeg.bat " + videoRealPath + " " + imageRealPath);
    
            } catch (IOException e) {
    
                // TODO Auto-generated catch block
                e.printStackTrace();
    
            }
        }
    }

    3.实现的效果

    由于该项目要使用docker构建,最终这个方法被舍弃~~,调研了另外一种使用java包的方式实现

    方式二:使用javacv包

    一、添加maven依赖

    <dependency>
        <groupId>org.bytedeco</groupId>
        <artifactId>javacv-platform</artifactId>
        <version>1.3.1</version>
    </dependency>

    二、java实现

        /**
         * 截取视频第六帧的图片
         * @param filePath 视频路径
         * @param dir 文件存放的根目录
         * @return 图片的相对路径 例:pic/1.png
         * @throws FrameGrabber.Exception
         */
        public static String videoImage(String filePath,String dir) throws FrameGrabber.Exception {
            String pngPath = "";
            FFmpegFrameGrabber ff = FFmpegFrameGrabber.createDefault(filePath);
    
            ff.start();
            int ffLength = ff.getLengthInFrames();
            Frame f;
            int i = 0;
            while (i < ffLength) {
                f = ff.grabImage();
                //截取第6帧
                if((i>5) &&  (f.image != null)){
                    //生成图片的相对路径 例如:pic/uuid.png
                    pngPath = getPngPath();
                    //执行截图并放入指定位置
                    doExecuteFrame(f, dir+pngPath);
                    break;
                }
                i++;
            }
            ff.stop();
    
            return pngPath;
        }
    
        /**
         * 生成图片的相对路径
         * @return 图片的相对路径 例:pic/1.png
         */
        private static String getPngPath(){
            return  "pic/"+getUUID()+".png";
        }
    
    
        /**
         * 生成唯一的uuid
         * @return uuid
         */
        private static String getUUID(){
            return UUID.randomUUID().toString().replace("-","");
        }
    
    
        /**
         * 截取缩略图
         * @param f Frame
         * @param targerFilePath:封面图片存放路径
         */
        private static void doExecuteFrame(Frame f, String targerFilePath) {
            String imagemat = "png";
            if (null == f || null == f.image) {
                return;
            }
            Java2DFrameConverter converter = new Java2DFrameConverter();
            BufferedImage bi = converter.getBufferedImage(f);
            File output = new File(targerFilePath);
            try {
                ImageIO.write(bi, imagemat, output);
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
  • 相关阅读:
    Linux kernel 之 uart 驱动解析
    按键驱动程序(异步通知)
    常用Linux运维命令
    进程上下文、中断上下文及原子上下文
    Linux 设备驱动开发 —— platform设备驱动应用实例解析
    C++中rapidxml用法及例子(源码)
    hpp.h与.h的区别
    使用Visual Studio扩展插件Visual assist X给代码插入注释模板
    VC++ MFC SDI/MDI Ribbon程序的停靠窗格被关闭后如何再次显示
    “ping某个IP地址,如果ping不通则在dos窗口或弹出MsgBox提示原因”的批处理bat命令
  • 原文地址:https://www.cnblogs.com/yy136/p/9608985.html
Copyright © 2011-2022 走看看