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());//13002000System.out.println(fFmpegFrameGrabber.getLengthInTime());//13002000System.out.println(fFmpegFrameGrabber.getLengthInFrames());//390System.out.println(fFmpegFrameGrabber.getVideoFrameRate());//30.0//视频秒数=fFmpegFrameGrabber.getLengthInTime()/1000000LSystem.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的文档以获取更多信息和示例。
下一篇,将多个视频和音频拼接为一个完整视频