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

这篇具有很好参考价值的文章主要介绍了javacv和opencv对图文视频编辑-按指定间隔从视频抽取缩略图。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

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

直接上代码

首先pom

引入了javacv和Thumbnails

        <!-- 引入javacv -->
        <dependency>
            <groupId>org.bytedeco</groupId>
            <artifactId>javacv</artifactId>
            <version>1.5.6</version>
        </dependency>
        <!--此包会自动引入各大平台的依赖jar(内含dll)-->
        <dependency>
            <groupId>org.bytedeco</groupId>
            <artifactId>javacv-platform</artifactId>
            <version>1.5.6</version>
        </dependency>


        <!-- 图片处理 -->
        <dependency>
            <groupId>net.coobird</groupId>
            <artifactId>thumbnailator</artifactId>
            <version>0.4.8</version>
        </dependency>

代码:

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的文档以获取更多信息和示例。

下一篇,将多个视频和音频拼接为一个完整视频文章来源地址https://www.toymoban.com/news/detail-809677.html

到了这里,关于javacv和opencv对图文视频编辑-按指定间隔从视频抽取缩略图的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • OpenCV对指定目录下所有视频批量生成九宫格缩略图

    最近接到一个客户的订单,需要批量对电影片段截图,为了方便,于是我撸了一下午代码,写了这么一个辅助工具出来,希望对各位有相似需求的朋友们提供帮助。程序是用Python实现的。 1. 使用os.walk遍历当前目录(包括子目录)下所有文件,获得文件路径列表,再对列表中

    2024年02月02日
    浏览(34)
  • python OpenCV 按时间间隔截取视频中任意片段帧

    通过视频制作相应的数据集,截取视频中的任意片段帧。  使用python截取视频中的任意片段帧,直接上代码: 

    2024年02月16日
    浏览(49)
  • C# 生成指定图片的缩略图

    目录 应用场景 开发运行环境 方法设计 实现代码 方法代码 调用示例 小结 我们假设会有如下场景: 场景1:培训系统中,在上传课件培训视频素材的功能,我们会上传课程封面图片,将来会在课程详情内容中在指定的位置输出。 场景2:人才网站中,企业端管理后台,会上传

    2024年04月25日
    浏览(36)
  • 编辑器的缩略图实现原理

    部分 Web 版的 IDE 编辑器未曾实现缩略图功能,探寻一下缩略图的实现逻辑。以 VSCode 为例。 VSCode 的编辑器是 monaco 实现的,编辑器的编辑区都是采用的 虚拟渲染 ,即仅渲染可视区的代码,可视区之外的动态去除 DOM 节点。 打开 VScode Help Toggle Developer Tools,观察 DOM 节点的状态

    2024年02月09日
    浏览(40)
  • 使用opencv及FFmpeg编辑视频

    帮朋友做了一个小作业,具体实现分为几个过程: 将两个mp4格式视频融合到一起 为新视频添加声音 其中一个视频为背景。 此时保存的视频没有声音。 从官网下载安装包,跳转到链接: 我使用的是第一个压缩包。剪切到自定义位置,并设置好系统路径。 我这里的路径是 \\\'

    2024年02月07日
    浏览(37)
  • Vue + Element 实现按钮指定间隔时间点击

    需要加一个按钮,调用第三方API,按钮十分钟之内只能点击一次,刷新页面也只能点击一次 加一个本地缓存的时间戳,通过时间戳计算指定时间内不能点击按钮 // 注:指定时间可以根据需要更新,比如1分钟内只能点击一次,只需要将循环部分改为 if (!storedTime || (currentTime

    2024年02月05日
    浏览(49)
  • Python 基于 OpenCV 视觉图像处理实战 之 OpenCV 简单视频处理实战案例 之五 简单指定视频某片段重复播放效果

    目录 Python 基于 OpenCV 视觉图像处理实战 之 OpenCV 简单视频处理实战案例 之五 简单指定视频某片段重复播放效果 一、简单介绍 二、简单指定视频某片段重复播放效果实现原理 三、简单指定视频某片段重复播放效果案例实现简单步骤 四、注意事项 Python是一种跨平台的计算机

    2024年04月12日
    浏览(101)
  • Python 基于 OpenCV 视觉图像处理实战 之 OpenCV 简单视频处理实战案例 之六 简单指定视频某片段慢放效果

    目录 Python 基于 OpenCV 视觉图像处理实战 之 OpenCV 简单视频处理实战案例 之六 简单指定视频某片段慢放效果 一、简单介绍 二、简单指定视频某片段慢放效果实现原理 三、简单指定视频某片段慢放效果案例实现简单步骤 四、注意事项 Python是一种跨平台的计算机程序设计语言

    2024年04月14日
    浏览(61)
  • 查看视频文件关键帧间隔

    一、Elecard StreamEye Tools拖放视频文件查看。 红的是I帧;蓝的是P帧;绿的是B帧。 二、ffprobe -show_streams统计。 1、统计视频关键帧、非关键帧 再统计1.json文件中flags字段,如果为K_表示关键帧,否则非关键帧。找第一个K_与下一个K_间隔多少帧,就是GOP间隔。 ffprobe其他常用opti

    2024年02月09日
    浏览(34)
  • Java音视频处理——JavaCV

    目录   简介 Maven 软件环境 JavaCV-Examples OpenCV Cookbook Examples 概述 示例 OpenCV文档 如何使用JavaCV示例 示例代码的组织结构 示例列表 Why Scala? 学习地址 图像简单处理代码示例 1.打开保存一张图  2.画直线 3.画圆圈 4.画折现 5.添加文字水印 6.裁剪并局部放大 7.人脸检测 视频简单处

    2024年02月03日
    浏览(94)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包