javacv和opencv对图文视频编辑-按指定间隔从视频抽取缩略图

1、java代码抽取视频缩略图

直接上代码

首先pom

引入了javacv和Thumbnails

        
        
            org.bytedeco
            javacv
            1.5.6
        
        
        
            org.bytedeco
            javacv-platform
            1.5.6
        


        
        
            net.coobird
            thumbnailator
            0.4.8
        

代码:

package com.bitar.javavideo.test;

import net.coobird.thumbnailator.Thumbnails;
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.io.File;
import java.io.IOException;


/**
 * 从视频固定间隔抽帧,并保存为图片
 */
public class Test02 {


    public static void main(String[] args) throws IOException {
        String videoUrl = "D:\\desktop\\test\\test02\\01-result.mp4";
        videoIntercept("D:\\desktop\\test\\test02\\", videoUrl, 1000);

    }


    /**
     * 视频文件指定时间段的帧截取
     *
     * @param outDir       输出目录
     * @param videoUrl     视频文件URL
     * @param milliSeconds 多少毫秒一张
     * @return
     */
    public static void videoIntercept(String outDir, String videoUrl, long milliSeconds) {
        //<时间, 图片流>
        FFmpegFrameGrabber fFmpegFrameGrabber = new FFmpegFrameGrabber(videoUrl);
        fFmpegFrameGrabber.setOption("timeout", "40000000");

        try {
            fFmpegFrameGrabber.start();
            System.out.println(fFmpegFrameGrabber.getFormatContext().duration());//13002000
            System.out.println(fFmpegFrameGrabber.getLengthInTime());//13002000
            System.out.println(fFmpegFrameGrabber.getLengthInFrames());//390
            System.out.println(fFmpegFrameGrabber.getVideoFrameRate());//30.0
            //视频秒数=fFmpegFrameGrabber.getLengthInTime()/1000000L
            System.out.println(fFmpegFrameGrabber.getLengthInTime() / 1000000L);//13

            //实际不到13秒,但是计算的帧数按时间计算有偏差
            long total = fFmpegFrameGrabber.getLengthInTime();
            long start = 0;
            int num = 0;
            while (start <= total) {
                //不设置setTimestamp ,则逐帧拉取
                fFmpegFrameGrabber.setTimestamp(start);
                //逐帧拉取
                Frame frame = fFmpegFrameGrabber.grabImage();
                //因为秒计算有误差,导致溢出边界
                if (frame == null) {
                    break;
                }
                num++;
                boolean ok = frameToImageFile(frame, String.format("%s/%s", outDir, num + ".jpg"),null);
                //缩小图片
                //Thumbnails.of(String.format("%s/%s", outDir, num + ".jpg")).size(512, 512).toFile(String.format("%s/%s", outDir, num + ".jpg"));
                System.out.println(num + "=" + ok);
                start += milliSeconds * 1000L;
                if (start > total) {
                    break;
                }

            }
            fFmpegFrameGrabber.stop();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    /**
     *
     * @param frame
     * @param fileName
     * @param imgFormatName 默认jpg
     * @return
     * @throws IOException
     */
    public static boolean frameToImageFile(Frame frame, String fileName, String imgFormatName) throws IOException {
        if (frame == null || frame.image == null) {
            return false;
        }
        if (imgFormatName == null || imgFormatName.length() == 0) {
            imgFormatName = "jpg";
        }

        Java2DFrameConverter converter = new Java2DFrameConverter();
        BufferedImage bi = converter.getBufferedImage(frame);
        //图片格式可调整
        return ImageIO.write(bi, imgFormatName, new File(fileName));
    }


}

//代码中有注释,建议本地运行和调试,上手快

2、利用ffmpeg的命令行抽取

要从视频中抽取缩略图,您可以使用ffmpeg命令行工具。以下是从视频中按指定间隔抽取缩略图的步骤:

  1. 下载并安装ffmpeg:您可以从官方网站(https://ffmpeg.org/)下载适合您操作系统的版本,并将其安装到您的计算机上。

  2. 打开命令提示符(Windows)或终端(Mac和Linux)。

  3. 导航到包含您的视频文件的目录。例如,如果视频文件位于桌面上的"video"文件夹中,则可以使用以下命令导航到该目录:

cd Desktop/video

  1. 使用以下命令从视频中抽取缩略图:
ffmpeg -i input_video.mp4 -vf fps=1/10 thumbnail%d.png

在这个命令中,您需要将"input_video.mp4"替换为您的视频文件名。指定的"-vf fps=1/10"选项表示您想要每10帧抽取一个缩略图。"thumbnail%d.png"指定了输出文件的名称和格式,其中"%d"将被替换为序号(例如,thumbnail1.png,thumbnail2.png等)。

  1. 执行命令后,ffmpeg将开始处理视频并抽取缩略图。您会在当前目录下看到生成的缩略图文件。

请注意,ffmpeg还有许多其他选项和参数,您可以根据您的需求进行自定义。您可以参考ffmpeg的文档以获取更多信息和示例。

下一篇,将多个视频和音频拼接为一个完整视频

你可能感兴趣的:(opencv,音视频,人工智能)