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命令行工具。以下是从视频中按指定间隔抽取缩略图的步骤:
-
下载并安装ffmpeg:您可以从官方网站(https://ffmpeg.org/)下载适合您操作系统的版本,并将其安装到您的计算机上。
-
打开命令提示符(Windows)或终端(Mac和Linux)。
-
导航到包含您的视频文件的目录。例如,如果视频文件位于桌面上的"video"文件夹中,则可以使用以下命令导航到该目录:
cd Desktop/video
- 使用以下命令从视频中抽取缩略图:
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等)。
- 执行命令后,ffmpeg将开始处理视频并抽取缩略图。您会在当前目录下看到生成的缩略图文件。
请注意,ffmpeg还有许多其他选项和参数,您可以根据您的需求进行自定义。您可以参考ffmpeg的文档以获取更多信息和示例。文章来源:https://www.toymoban.com/news/detail-809677.html
下一篇,将多个视频和音频拼接为一个完整视频文章来源地址https://www.toymoban.com/news/detail-809677.html
到了这里,关于javacv和opencv对图文视频编辑-按指定间隔从视频抽取缩略图的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!