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();
        }
    }

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM