java集成opencv,将视频按帧进行拆分

需求:将视频按照每一帧进行拆分,并且保存为图片。每张图片的名字为当前帧的时间。

 

1、window10 系统 安装opencv 4.52版本

      下载地址:Find out more about OpenCV | SourceForge.net

2、自定义安装目录,直接安装

3、 将Opencv库添加到项目中

        在IDEA 中的 Project Structure => Modules => Dependencies 中添加 opencv 安装目录下的的jar包 D:\opencv\build\java\opencv-452.jar

同时将D:\opencv\build\java\x64\opencv_java452.dll,添加为Native Libary

java集成opencv,将视频按帧进行拆分_第1张图片

上述操作是为了下面代码做铺垫,把opencv库添加进来。

//加载本地的OpenCV库,这样就可以用它来调用Java API
        System.loadLibrary(Core.NATIVE_LIBRARY_NAME);

代码:

   // 创建VideoCapture对象 
VideoCapture cap = new VideoCapture(videoPath);
                    //判断视频是否打开
       if (cap.isOpened()) {
                        //总帧数
         int frameCount = new Double(cap.get((Videoio.CAP_PROP_FRAME_COUNT))).intValue();

         logger.info("{}视频一共{}帧", file_name, frameCount);
                        // 创建mat
         Mat frame = new Mat();
         for (int i = 0; i < frameCount; i++) {
               // 读取下一帧的数据
              if (cap.read(frame)) {
                  // 获取当前帧的时间戳
            int video_mesc = new Double(cap.get(Videoio.CAP_PROP_POS_MSEC)).intValue();
//          cap.set(Videoio.CAP_PROP_POS_MSEC,2 * 1000);
            //  file_date通过视频名字获取时间,然后根据帧的视频戳进行相加计算
            String curTime = simpleDateFormat.format(new Date(file_date.getTime() + video_mesc));
            String outFileName = out_directory + File.separator + file_name + "@" + curTime + ".jpg";
            // 写出图片
            Imgcodecs.imwrite(outFileName, frame);
    }
}

问题记录:

1、VideoCapture的isOpened()方法一直返回false。

解决办法:

         将opencv安装目录D:\opencv\build\x64\vc14\bin中的opencv_videoio_ffmpeg452_64.dll复制到生成 java的安装目录 C:\Program Files\Java\jdk1.8.0_191\bin 中去。

2、读取帧 提示:[NULL @ 0000022362197940] non-existing PPS 0 referenced

     当根据时间获取相应的帧数据时,会出现ffmpeg解析问题,不知道如何解决。暂时没用,给注掉了。

 cap.set(Videoio.CAP_PROP_POS_MSEC,2 * 1000);

你可能感兴趣的:(javacv,opencv,java,音视频)