實際開發之截取視頻某一幀做為縮略圖


一、需求背景

   需要從上傳視頻中截取某一幀作為文件的封面圖(縮略圖)

 

二、引入jar

   1.maven下引入

      <!--start:視頻獲取某一幀的圖片-->

      <dependency>
         <groupId>org.bytedeco</groupId>
         <artifactId>javacv</artifactId>
         <version>1.4.3</version>
      </dependency>

      <dependency>
         <groupId>org.bytedeco.javacpp-presets</groupId>
         <artifactId>ffmpeg-platform</artifactId>
         <version>4.0.2-1.4.3</version>
      </dependency>
      <!--end:視頻獲取某一幀的圖片-->
   2.gradle下引入

   /*start:視頻獲取某一幀的圖片*/
grab_video_1 = ["org.bytedeco:javacv:1.4.3"]
grab_video_2 = ["org.bytedeco.javacpp-presets:ffmpeg-platform:4.0.2-1.4.3"]
/*end:視頻獲取某一幀的圖片*/
   dependencies{
      compile grab_video_1,grab_video_2
   }

三、工具類
1.導包
      import org.bytedeco.javacv.FFmpegFrameGrabber;
      import org.bytedeco.javacv.Frame;
      import org.bytedeco.javacv.Java2DFrameConverter;
      import javax.imageio.ImageIO;
      import java.awt.image.BufferedImage;
      import java.util.UUID;
      import java.io.File;
2.代碼
    /**
    * 提取圖片:指定幀
    *
    * @param filePath 視頻文件地址
    * @param tempPath 臨時文件地址
    */
    public String grabImg(String filePath, String tempPath) {

    if (StringUtils.isBlank(filePath)) {
    return null;
    }

    File tempFile = new File(filePath);
    if (!tempFile.exists()) {
    return null;
    }

    //最后獲取到的縮略圖的路徑
    String appointFramePicture = "";
    //Frame對象
    Frame frame = null;
    //標識:第幾幀
    int flag = 0;

    try {
    //獲取視頻文件
    FFmpegFrameGrabber fFmpegFrameGrabber = new FFmpegFrameGrabber(filePath);
    fFmpegFrameGrabber.start();

    //獲取視頻總幀數
    int ftp = fFmpegFrameGrabber.getLengthInFrames();

    while (flag <= ftp) {
    frame = fFmpegFrameGrabber.grabImage();

    //對視頻第五幀進行處理
    if (frame!=null && flag==5) {
    //圖片文件路徑
    appointFramePicture = tempPath + File.separator + UUID.randomUUID().toString() + "_" + String.valueOf(flag) + ".jpg";

    //文件存儲對象
    File outPut = new File(appointFramePicture);
    ImageIO.write(frameToBufferedImage(frame), "jpg", outPut);

    break;
    }
    flag++;
    }
    fFmpegFrameGrabber.stop();
    fFmpegFrameGrabber.close();
    } catch (Exception e) {
    e.printStackTrace();
    }
    return appointFramePicture;
    }

    public static BufferedImage frameToBufferedImage(Frame frame) {
    //創建BufferedImage對象
    Java2DFrameConverter converter = new Java2DFrameConverter();
    BufferedImage bufferedImage = converter.getBufferedImage(frame);
    return bufferedImage;
    }


免責聲明!

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



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