Java之~ 视频JavaCV生成缩略图,获取视频第一帧图片路径

具体参考:https://blog.csdn.net/l1028386804/article/details/79755510

一、创建项目

1、创建Maven项目

2、添加依赖,导入jar包

在pom.xml中添加依赖配置 javacpp.jar,javacv-platform.jar具体如下:

 

<!-- video -->

<dependencies> 

<dependency>

    <groupId>org.bytedeco</groupId>

    <artifactId>javacpp</artifactId>

    <version>1.4.1</version>

</dependency>

                                    

                                    

  <dependency>

    <groupId>org.bytedeco</groupId>

    <artifactId>javacv-platform</artifactId>

    <version>1.4.1</version>

</dependency>

</dependencies> 

javacpp-1.4.1.jar

javacv-platform-1.4.1.jar 

http://www.mvnjar.com/noneresult.html    该地址下载最新jar包

 

二、具体实现

写一个公用的工具类获取视频的第一帧

package com.javajy.util;

import org.bytedeco.javacpp.opencv_core;
import org.bytedeco.javacpp.opencv_core.IplImage;
import org.bytedeco.javacv.FFmpegFrameGrabber;
import org.bytedeco.javacv.Frame;
import org.bytedeco.javacv.Java2DFrameConverter;
import org.bytedeco.javacv.OpenCVFrameConverter;

import javax.imageio.ImageIO;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;

public class VideoUtil {
    
    public static String host ="http://************";//服务器IP
    public static String rootPath= "E:\\tomcat/webapps/***(项目名)/image/";//服务器路径
    
    private static final String IMAGEMAT = "png";  //图片格式
    private static final String ROTATE = "rotate";  
    public static final int MOD = 1;//第一帧
    
    public static void main(String[] args) throws Exception {
        
        //System.out.println(VideoUtil.randomGrabberFFmpegVideoImage("1528887431390.png", MOD));
    }
    /** 
     * 获取视频缩略图 
     * @param lpath 
     * @param filePath:视频路径 
     * @param mod:视频长度/mod获取第几帧 
     * @throws Exception 
     */  
    public static String randomGrabberFFmpegVideoImage(String filePath, String lpath, int mod) throws Exception {  
        String targetFilePath = "";  
        FFmpegFrameGrabber ff = FFmpegFrameGrabber.createDefault(filePath);  
        ff.start();  
        String rotate = ff.getVideoMetadata(ROTATE);  
        int ffLength = ff.getLengthInFrames();  
        Frame f;  
        int i = 0;  
        int index = mod;  
        while (i < ffLength) {  
            f = ff.grabImage();  
            if(i == index){  
                if (null != rotate && rotate.length() > 1) {  
                    OpenCVFrameConverter.ToIplImage converter = new OpenCVFrameConverter.ToIplImage();  
                    IplImage src = converter.convert(f);  
                    f = converter.convert(rotate(src, Integer.valueOf(rotate)));  //旋转图片
                }  
                targetFilePath = getImagePath(lpath, i);  //根据视频路径生成缩略图存放路径 
                doExecuteFrame(f, targetFilePath);  //获取缩略图
                break;  
            }  
            i++;  
        }  
        ff.stop();  
        return targetFilePath;  //返回的是视频第一帧
    }  

    /** 
     * 旋转图片 
     * @param src 
     * @param angle 
     * @return 
     */  
    public static IplImage rotate(IplImage src, int angle) {  
        IplImage img = IplImage.create(src.height(), src.width(), src.depth(), src.nChannels());  
        opencv_core.cvTranspose(src, img);  
        opencv_core.cvFlip(img, img, angle);  
        return img;  
    } 
    
    /** 
     * 根据视频路径生成缩略图存放路径 
     * @param filePath:视频路径 
     * @param index:第几帧 
     * @return:缩略图的存放路径 
     */  
    private static String getImagePath(String filePath, int index){   
        return rootPath+filePath;
    } 
    /** 
     * 截取缩略图 
     * @param f 
     * @param targerFilePath:封面图片 
     */  
    public static void doExecuteFrame(Frame f, String targerFilePath) {  
        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();
        } 
    }  

    /** 
     * 根据视频长度随机生成随机数集合 
     * @param baseNum:基础数字,此处为视频长度 
     * @param length:随机数集合长度 
     * @return:随机数集合 
     */  
    public static List<Integer> random(int baseNum, int length) {  
        List<Integer> list = new ArrayList<Integer>(length);  
        while (list.size() < length) {  
            Integer next = (int) (Math.random() * baseNum);  
            if (list.contains(next)) {  
                continue;  
            }  
            list.add(next);  
        }  
        Collections.sort(list);  
        return list;  
    }  


}

三。调用该工具类

String path ="上传的视频路径";(http://***********/image/1532505427121.mp4

String lpath ="";

String vPath ="”;
                        try {
                            lpath = path.substring(path.lastIndexOf("/")+1,path.lastIndexOf("."))+".png";//自定义输出图片名截取与视频名一样
                            vPath = VideoUtil.randomGrabberFFmpegVideoImage(path, lpath, VideoUtil.MOD);//(这是视频的第一帧是保存的服务器的路径)
                        } catch (Exception e) {
                            e.printStackTrace();
                        }
                       vPath = host+"/项目名/image/"+lpath;(如果想要读取服务器的第一帧就要改成服务器的IP,存入数据库,方便读取图片)

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值