Opencv——处理视频转图片

原文链接: https://blog.csdn.net/qq_19662797/article/details/80543840

移动端自动化录制后的视频,需要进行转图片再做一些业务逻辑处理

package com.wx;

import org.bytedeco.javacv.FFmpegFrameGrabber;
import org.bytedeco.javacv.Frame;
import org.bytedeco.javacv.Java2DFrameConverter;
import org.opencv.core.Core;
import org.opencv.core.Mat;
import org.opencv.core.Scalar;
import org.opencv.imgcodecs.Imgcodecs;
import javax.imageio.ImageIO;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;

public class TestAviDemo {

    static{ System.load("/Users/wuxi/Downloads/opencv_java342.dylib");}
    //视频文件路径
    private static String videoPath = "/Users/wuxi/Movies/";
    //视频帧图片存储路径
    public static String videoFramesPath = "/Users/wuxi/Movies/";
    public static Mat flag5;
    public static Mat flag200;
    public static Mat flagresult=new Mat();
    /**
     * TODO 将视频文件帧处理并以“jpg”格式进行存储。
     * 依赖FrameToBufferedImage方法:将frame转换为bufferedImage对象
     *
     * @param videoFileName
     */
    public static void grabberVideoFramer(String videoFileName) {
        //Frame对象
        Frame frame = null;
        //标识
        int flag = 0;

        /*
          获取视频文件
         */
        FFmpegFrameGrabber fFmpegFrameGrabber = new FFmpegFrameGrabber(videoPath + "/" + videoFileName);

        try {
            fFmpegFrameGrabber.start();
            /*
            .getFrameRate()方法:获取视频文件信息,总帧数
             */
            int ftp = fFmpegFrameGrabber.getLengthInFrames();
            System.out.println(fFmpegFrameGrabber.grabKeyFrame());
            System.out.println(fFmpegFrameGrabber.getFrameRate());
            System.out.println("时长 " + ftp / fFmpegFrameGrabber.getFrameRate() / 60);

            System.out.println("开始运行视频提取帧,耗时较长");

            while (flag <= ftp) {
                //文件绝对路径+名字
                String fileName = videoFramesPath + "/img_" + String.valueOf(flag) + ".jpg";
                //文件储存对象
                File outPut = new File(fileName);
                //获取帧
                frame = fFmpegFrameGrabber.grabImage();
                if (frame != null&&flag==200) {
                    ImageIO.write(FrameToBufferedImage(frame), "jpg", outPut);
                   flag5= Imgcodecs.imread(fileName);
                }
                if (frame != null&&flag==201) {
                    //获取帧
                    ImageIO.write(FrameToBufferedImage(frame), "jpg", outPut);
                    flag200= Imgcodecs.imread(fileName);
                }
                flag++;
            }

            Core.absdiff(flag5,flag200,flagresult);
            Scalar scalar = Core.sumElems(flagresult);
            System.out.println(scalar.toString());
            System.out.println("============运行结束============");

            fFmpegFrameGrabber.stop();

        } catch (IOException E) {
        }
    }
    public static BufferedImage FrameToBufferedImage(org.bytedeco.javacv.Frame frame) {
        //创建BufferedImage对象
        Java2DFrameConverter converter = new Java2DFrameConverter();
        BufferedImage bufferedImage = converter.getBufferedImage(frame);
        return bufferedImage;
    }
    /*
        测试.....
     */
    public static void main(String[] args) {

        String videoFileName = "test.mov";

        grabberVideoFramer(videoFileName);

    }

}

 引用MAVEN包

<dependency>
    <groupId>org.bytedeco.javacpp-presets</groupId>
    <artifactId>ffmpeg-platform</artifactId>
    <version>3.2.1-1.3</version>
</dependency>

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

猜你喜欢

转载自blog.csdn.net/wx19900503/article/details/95361545