java利用javacv和ffmpeg截取视频提取视频封面生成缩略图,精减引用包

合集下载

java实现缩略图和抓屏幕

java实现缩略图和抓屏幕

java实现缩略图和抓屏幕java实现缩略图和抓屏幕在全球范围内,SUN公司的Java技术培训和认证不仅是Java 开发技术领域最权威的认证,同时也是开发类认证中很重要的一种.以下是我整理的关于java实现缩略图和抓屏幕,希望大家认真阅读!import java.awt.Container;import java.awt.Dimension;import java.awt.Graphics2D;import java.awt.Image;import java.awt.MediaTracker;import java.awt.Rectangle;import java.awt.RenderingHints;import java.awt.Robot;import java.awt.Toolkit;import java.awt.image.BufferedImage;import java.io.BufferedOutputStream;import java.io.File;import java.io.FileOutputStream;import javax.imageio.ImageIO;import com.sun.image.codec.jpeg.JPEGCodec;import com.sun.image.codec.jpeg.JPEGEncodeParam;import com.sun.image.codec.jpeg.JPEGImageEncoder;/**** 纯java API实现图片处理*Title:ImageChangeSize*Description:*Copyright: Copyright (c) 2021*Company:* @author* @version 1.0.0*/public class ImageChangeSize{public static void main ( String [] args )throws InterruptedException{//测试生成缩略图createThumbnail(c:\555.gif, 200, 200, 100, c:\uuuu.jpg); //测试捕捉屏幕,每隔一秒捕获一次String path = c:\screen\;int i = 0;for ( ;; ){i++;String filepath = path + i + .jpg;snatchScreen(filepath);Thread.currentThread().sleep(2000);}}/*** 处理图片,改变起大小,可进行缩略和放大* @param filename 源文件名称* @param thumbWidth 处理后宽度* @param thumbHeight 处理后高度* @param quality 品质最高100,最小0* @param outFilename 输出文件名称*/public static void createThumbnail ( String filename, int thumbWidth, int thumbHeight, int quality, String outFilename ){Image image = Toolkit.getDefaultToolkit().getImage(filename);MediaTracker mediaTracker = new MediaTracker(new Container());mediaTracker.addImage(image, 0);try{mediaTracker.waitForID(0);double thumbRatio = (double) thumbWidth / (double)thumbHeight;int imageWidth = image.getWidth(null);int imageHeight = image.getHeight(null);double imageRatio = (double) imageWidth / (double) imageHeight;if ( thumbRatio imageRatio ){thumbHeight = (int) ( thumbWidth / imageRatio );}else{thumbWidth = (int) ( thumbHeight * imageRatio );}BufferedImage thumbImage = new BufferedImage(thumbWidth, thumbHeight, BufferedImage.TYPE_INT_RGB);Graphics2D graphics2D = thumbImage.createGraphics();graphics2D.setRenderingHint(RenderingHints.KEY_INTERPOLATIO N, RenderingHints.VALUE_INTERPOLATION_BILINEAR);graphics2D.drawImage(image, 0, 0, thumbWidth, thumbHeight, null);BufferedOutputStream out = new BufferedOutputStream(new FileOutputStream(outFilename));JPEGImageEncoder encoder = JPEGCodec.createJPEGEncoder(out);JPEGEncodeParam param = encoder.getDefaultJPEGEncodeParam(thumbImage);quality = Math.max(0, Math.min(quality, 100));param.setQuality((float) quality / 100.0f, false);encoder.setJPEGEncodeParam(param);encoder.encode(thumbImage);out.close();}catch ( Exception e ){e.printStackTrace();}}/*** 抓取电脑屏幕* @param path*/public static void snatchScreen ( String path ){Robot robot;try{robot = new Robot();Dimension d = Toolkit.getDefaultToolkit().getScreenSize();Rectangle rect = new Rectangle(0, 0, d.width, d.height);BufferedImage image = robot.createScreenCapture(rect);ImageIO.write(image, jpg, new File(path));}catch ( Exception e ){System.out.println(Failed to snatch screen ... );e.printStackTrace();}}}【java实现缩略图和抓屏幕】。

javacv 使用手册

javacv 使用手册

javacv 使用手册JavaCV是一个用于处理图像和视频的Java库,它基于OpenCV和FFmpeg等开源库。

以下是JavaCV的使用手册:1. 安装JavaCV首先,您需要安装JavaCV。

您可以从官方网站上下载JavaCV,并按照说明进行安装。

确保您已经安装了Java Development Kit(JDK)版本8或更高版本。

2. 导入JavaCV库在您的Java项目中,您需要导入JavaCV库。

您可以将JavaCV库添加到您的项目的类路径中,或者使用Maven或Gradle等构建工具来管理依赖关系。

3. 读取图像和视频使用JavaCV,您可以读取图像和视频文件。

以下是一个简单的示例代码,演示如何使用JavaCV读取图像和视频:```javaimport ;public class ReadImageAndVideo {public static void main(String[] args) throws Exception {// 读取图像Frame frame = ("");// 显示图像CanvasFrame canvasFrame = new CanvasFrame("Image", 2); (frame);();// 读取视频FrameGrabber grabber = new FFmpegFrameGrabber("");();Frame frame2;while ((frame2 = ()) != null) {// 处理每一帧数据// ...}();}}```4. 处理图像和视频帧使用JavaCV,您可以对图像和视频帧进行处理。

以下是一个简单的示例代码,演示如何使用JavaCV处理图像和视频帧:```javaimport ;import _core.;import _imgproc.;import _objdetect.;import static _imgproc.;import static _objdetect.;public class ProcessImageAndVideo {public static void main(String[] args) throws Exception {// 读取图像并转为灰度图Frame frame = ("");Mat mat = (frame);Mat grayMat = new Mat();(mat, grayMat, _BGR2GRAY);// 显示灰度图CanvasFrame canvasFrame = new CanvasFrame("Gray Image", 2);((grayMat));();// 读取视频并检测人脸FrameGrabber grabber = new FFmpegFrameGrabber("");();CascadeClassifier faceDetector = newCascadeClassifier("haarcascade_frontalface_");MatOfRect faces = new MatOfRect(); // face detections are stored in this object, which is a vector of Rects(new Mat(()), faces); // detect faces in the video frame and store them in faces variable as Rectangles (x,y,width,height) in the image spacefor (Rect rect : ()) { // draw rectangle around face on the screen for visual feedback (if you want to) - not necessary for actual face detection processing...I just draw them here for the example to show faces are being detected correctly...you can remove this loop if you don't want to display rectangles on the screen...the code to draw the rectangle is already in the code above where we define the faceRectangle object...we just fill in the values for its x, y, width, and height here...it's just for display purposes only...you can remove this loop if you don't want to display rectangles on the screen...the code to draw the rectangle is already in the code above where we define the faceRectangle object...we just fill in the values for its x, y, width, and height here...it's just for display purposes only...you can remove this loop if you don't want to display rectangles on the screen...the code to draw the rectangle is already in the code above where we define the faceRectangle object...we just fill in the values for its x, y, width, and height here...it's just for display purposes。

Java与视频处理利用Java实现视频编辑和处理

Java与视频处理利用Java实现视频编辑和处理

Java与视频处理利用Java实现视频编辑和处理Java与视频处理——利用Java实现视频编辑和处理在当今数字化时代,视频成为了人们主要的媒介之一。

然而,为了获得更好的观看体验,常常需要对视频进行编辑和处理。

而Java作为一种高性能且通用的编程语言,为我们提供了实现视频编辑和处理的强大工具和框架。

本文将介绍如何利用Java来实现视频编辑和处理。

一、视频处理的基础知识在开始利用Java进行视频处理之前,我们需要了解一些视频处理的基础知识。

视频文件通常由一系列图像帧组成,通过以固定的时间间隔播放这些图像帧来实现动画效果。

视频处理包括但不限于视频剪辑、视频合并、视频转码、视频特效等。

二、Java处理视频的工具和框架1. JavaCVJavaCV是一个基于OpenCV和FFmpeg的Java开源项目,提供了一系列Java接口和类,用于在Java中处理视频和图像。

它可以实现视频剪辑、视频合并、视频转码等多种视频处理功能。

通过JavaCV,我们可以方便地调用底层的OpenCV和FFmpeg功能,实现对视频的各种操作。

2. XugglerXuggler是一个Java开源项目,用于在Java中处理音频和视频。

它提供了一套强大而易于使用的API,可以实现对视频的解码、编码、剪辑、合并等操作。

Xuggler使用了FFmpeg和X264等开源库,并通过Java接口封装了这些库的功能,使得我们可以直接在Java中调用它们。

3. JCodecJCodec是一个纯Java的视频编解码库,提供了一套功能强大且易于使用的API,用于在Java中进行视频编解码、剪辑、转码等操作。

JCodec支持各种常见的视频编解码格式,如H.264、MPEG-4等,并提供了高效的编解码算法和丰富的视频处理功能。

三、利用Java进行视频编辑和处理的实例下面将以视频剪辑和视频转码为例,介绍如何利用Java实现视频编辑和处理。

1. 视频剪辑视频剪辑是将一个视频文件按照指定的时间段进行截取,生成一个新的视频文件。

java图片裁剪和java生成缩略图

java图片裁剪和java生成缩略图

if (suffix == null || types.toLowerCase().indexOf(suffix.toLowerCase() + ",") < 0) { log.error("Sorry, the image suffix is illegal. the standard image suffix is {}."+ types); return; } // 将FileInputStream 转换为ImageInputStream iis = ImageIO.createImageInputStream(fis); // 根据图片类型获取该种类型的ImageReader ImageReader reader = ImageIO.getImageReadersBySuffix(suffix).next(); reader.setInput(iis, true); ImageReadParam param = reader.getDefaultReadParam(); ceRegion(rect); BufferedImage bi = reader.read(0, param); ImageIO.write(bi, suffix, output); ("图片生成成功,请到目录下查看"); } catch (FileNotFoundException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } finally { try { if (fis != null) fis.close(); if (iis != null) iis.close(); } catch (IOExcep(); } } } else { log.warn("the src image is not exist."); } }

javacv中ffmpegframegrabber使用时的一些注意事项

javacv中ffmpegframegrabber使用时的一些注意事项

javacv中ffmpegframegrabber使用时的一些注意事项FFmpegFrameGrabber是JavaCV库中用于捕捉视频帧的类。

在使用FFmpegFrameGrabber时,有一些注意事项需要注意,以确保能够正确地使用它来捕捉视频帧。

1. 安装FFmpeg:FFmpegFrameGrabber依赖于FFmpeg库来进行视频帧的捕捉和解码。

确保在使用FFmpegFrameGrabber之前已经安装了FFmpeg,并且能够正确地运行FFmpeg命令。

2. 导入正确的依赖项:在使用JavaCV库时,需要正确地导入相关的依赖项。

确保在项目的构建路径中添加了JavaCV和FFmpeg的相关依赖项,以及所需的其他依赖项。

3. 设置输入源:使用FFmpegFrameGrabber之前,你需要设置输入源的路径或URL。

输入源可以是本地文件路径或是网络视频的URL。

例如:```String videoPath = "path/to/video.mp4";FFmpegFrameGrabber grabber = newFFmpegFrameGrabber(videoPath);```4. 打开输入源:在设置输入源之后,需要调用grabber的`start`方法来打开输入源,以便可以开始捕捉视频帧。

例如:```grabber.start(;```5. 获取视频帧:一旦成功打开了输入源,就可以开始捕捉视频帧。

使用grabber的`grab`方法来获取视频帧。

例如:```Frame frame = grabber.grab(;```6. 处理视频帧:一旦获取到视频帧,就可以对其进行进一步处理。

视频帧可以是图片、音频或其他类型的数据。

你可以将其转换为OpenCV 的Mat对象来使用OpenCV库进行进一步的图像处理。

例如:```OpenCVFrameConverter.ToMat converter = new OpenCVFrameConverter.ToMat(;Mat mat = converter.convert(frame);```7. 释放资源:在使用完FFmpegFrameGrabber后,记得调用grabber 的`stop`方法来释放资源。

java使用ffmpeg实现上传视频的转码提取视频的截图等功能(代码操作)

java使用ffmpeg实现上传视频的转码提取视频的截图等功能(代码操作)

java使⽤ffmpeg实现上传视频的转码提取视频的截图等功能(代码操作)ffmpeg视频采集功能⾮常强⼤,不仅可以采集视频采集卡或USB摄像头的图像,还可以进⾏屏幕录制,同时还⽀持以RTP⽅式将视频流传送给⽀持RTSP的流媒体服务器,⽀持直播应⽤。

ffmpeg能解析的格式和不能解析的格式都⼀⼀给⼤家说明了,具体内容详情跟随⼀起看看吧,1.能⽀持的格式ffmpeg能解析的格式:(asx,asf,mpg,wmv,3gp,mp4,mov,avi,flv等)2.不能⽀持的格式对ffmpeg⽆法解析的⽂件格式(wmv9,rm,rmvb等),可以先⽤别的⼯具(mencoder)转换为avi(ffmpeg能解析的)格式.实例是将上传视频转码为flv格式,该格式ffmpeg⽀持,所以我们实例中需要ffmpeg视频处理⼯具.使⽤ffmpeg⼯具进⾏转码前应该做的准备⼯作:1.下载ffmpeg,下载路径:图1:图2:2)安装进⼊解压后⽂件的bin⽬录下,可以看到相应的.exe⽂件。

将bin⽬录添加到环境变量path中,注意以分号结尾。

验证是否安装成功:运⾏cmd命令,在控制台输⼊命令:ffmpeg -version,结果如下所⽰:安装成功!安装成功之后,就可以在代码⾥引⽤了:视频转码和视频截图代码如下:public class VideoConvert {/*** 视频转码* @param ffmpegPath 转码⼯具的存放路径* @param upFilePath ⽤于指定要转换格式的⽂件,要截图的视频源⽂件* @param codcFilePath 格式转换后的的⽂件保存路径* @param mediaPicPath 截图保存路径* @return* @throws Exception*/public static boolean executeCodecs(String ffmpegPath, String upFilePath, String codcFilePath,String mediaPicPath) throws Exception { // 创建⼀个List集合来保存转换视频⽂件为flv格式的命令List<String> convert = new ArrayList<String>();convert.add(ffmpegPath); // 添加转换⼯具路径convert.add("-i"); // 添加参数"-i",该参数指定要转换的⽂件convert.add(upFilePath); // 添加要转换格式的视频⽂件的路径convert.add("-qscale"); //指定转换的质量convert.add("6");convert.add("-ab"); //设置⾳频码率convert.add("64");convert.add("-ac"); //设置声道数convert.add("2");convert.add("-ar"); //设置声⾳的采样频率convert.add("22050");convert.add("-r"); //设置帧频convert.add("24");convert.add("-y"); // 添加参数"-y",该参数指定将覆盖已存在的⽂件convert.add(codcFilePath);// 创建⼀个List集合来保存从视频中截取图⽚的命令List<String> cutpic = new ArrayList<String>();cutpic.add(ffmpegPath);cutpic.add("-i");cutpic.add(upFilePath); // 同上(指定的⽂件即可以是转换为flv格式之前的⽂件,也可以是转换的flv⽂件)cutpic.add("-y");cutpic.add("-f");cutpic.add("image2");cutpic.add("-ss"); // 添加参数"-ss",该参数指定截取的起始时间cutpic.add("1"); // 添加起始时间为第1秒cutpic.add("-t"); // 添加参数"-t",该参数指定持续时间cutpic.add("0.001"); // 添加持续时间为1毫秒cutpic.add("-s"); // 添加参数"-s",该参数指定截取的图⽚⼤⼩cutpic.add("350*240"); // 添加截取的图⽚⼤⼩为350*240cutpic.add(mediaPicPath); // 添加截取的图⽚的保存路径boolean mark = true;ProcessBuilder builder = new ProcessBuilder();try {mand(convert);builder.redirectErrorStream(true);builder.start();mand(cutpic);builder.redirectErrorStream(true);// 如果此属性为 true,则任何由通过此对象的 start() ⽅法启动的后续⼦进程⽣成的错误输出都将与标准输出合并,//因此两者均可使⽤ Process.getInputStream() ⽅法读取。

javacv 使用手册

javacv 使用手册

javacv 使用手册JavaCV是一个Java库,它提供了对OpenCV、FFmpeg、Librealsense等多个计算机视觉和音视频处理库的支持。

它旨在简化使用这些库的过程,使开发者能够更方便地在Java应用程序中进行计算机视觉和音视频处理。

JavaCV的使用手册主要包括以下几个方面的内容:1.安装和配置:JavaCV可以通过Maven或Gradle等构建工具进行安装。

在使用JavaCV之前,需要先安装和配置OpenCV、FFmpeg等库。

JavaCV提供了清晰的安装和配置指南,以帮助开发者快速搭建环境。

2.图像处理:JavaCV提供了一系列用于图像处理的功能,包括图像读取、保存、显示、缩放、旋转、裁剪等。

开发者可以使用JavaCV来加载和处理图像,以及进行常见的操作,如边缘检测、颜色转换、图像分割等。

3.视频处理:JavaCV还提供了丰富的视频处理功能,包括视频读取、写入、合并、剪辑、转码等。

开发者可以使用JavaCV来处理视频文件,实现从视频中提取帧、分析视频流、添加水印等操作。

4.特征提取与匹配:JavaCV支持常见的特征提取和匹配算法,如SIFT、SURF、ORB等。

开发者可以使用JavaCV来检测图像中的关键点,计算特征描述符,并进行特征匹配和图像识别等任务。

5.目标检测与跟踪:JavaCV提供了多个目标检测和跟踪算法的实现,如Haar级联、HOG+SVM、深度学习等。

开发者可以使用JavaCV来进行人脸检测、物体跟踪等任务。

6.音频处理:JavaCV还提供了对音频处理的支持,包括音频采集、播放、剪辑、转码等。

开发者可以使用JavaCV来处理音频文件,实现音频录制、音频处理、音频分析等功能。

7.深度学习:JavaCV通过支持OpenCV的dnn模块,提供了对深度学习模型的支持。

开发者可以使用JavaCV来加载和运行训练好的模型,进行图像分类、物体检测、语义分割等任务。

以上只是JavaCV使用手册的一些主要内容,实际上JavaCV还提供了很多其他功能和接口,如光流估计、立体视觉、相机标定、图像配准等。

java利用javacv和ffmpeg截取视频提取视频封面生成缩略图,精减引用包

java利用javacv和ffmpeg截取视频提取视频封面生成缩略图,精减引用包

java利用javacv和ffmpeg截取视频提取视频封面生成缩略图,精减引用包java利用javacv和ffmpeg截取视频提取视频封面,精减引用包废话少说,直接上代码:package /doc/114340539.html,mons.util;import org.bytedeco.javacv.FFmpegFrameGrabber;import org.bytedeco.javacv.FrameGrabber;import org.bytedeco.javacv.Java2DFrameConverter;import org.slf4j.Logger;import org.slf4j.LoggerFactory;import javax.imageio.ImageIO;import java.awt.*;import java.awt.image.BufferedImage;import java.io.File;import java.io.IOException;public class VideoUtil {static Logger log = LoggerFactory.getLogger(VideoUtil.class);/*** 获取视频时长,单位为秒** @param video 源视频文件* @return 时长(s)*/public static Long getVideoDuration(File video) {Long duration = 0L;FFmpegFrameGrabber ff = new FFmpegFrameGrabber(video);try {ff.start();duration = ff.getLengthInTime() / (1000 * 1000);ff.stop();} catch (FrameGrabber.Exception e) {e.printStackTrace();}return duration;}/*** 截取视频获得指定帧的图片** @param video 源视频文件* @param picPath 截图存放路径*/public static void getVideoPic(File video, String picPath) {FFmpegFrameGrabber ff = new FFmpegFrameGrabber(video);try {ff.start();// 截取中间帧图片(具体依实际情况而定)int i = 0;int length = ff.getLengthInFrames();int middleFrame = length / 2;org.bytedeco.javacv.Frame frame = null;while (i < length) {frame = ff.grabFrame();if ((i > middleFrame) && (frame.image != null)) {break;}i++;}// 截取的帧图片Java2DFrameConverter converter = new Java2DFrameConverter();BufferedImage srcImage = converter.getBufferedImage(frame);int srcImageWidth = srcImage.getWidth();int srcImageHeight = srcImage.getHeight();// 对截图进行等比例缩放(缩略图)int width = 480;int height = (int) (((double) width / srcImageWidth) * srcImageHeight);BufferedImage thumbnailImage = new BufferedImage(width, height, BufferedImage.TYPE_3BYTE_BGR);thumbnailImage.getGraphics().drawImage(srcImage.getScal edInstance(width, height, Image.SCALE_SMOOTH), 0, 0, null);File picFile = new File(picPath);ImageIO.write(thumbnailImage, "jpg", picFile);ff.stop();} catch (IOException e) {e.printStackTrace();}}public static void main(String[] args) {String videoPath ="d:\\111.mp4";// String audioPath = "d:\\20200222_161159.m4a";File video = new File(videoPath);String picPath = "d:\\video.jpg";getVideoPic(video, picPath);long duration = getVideoDuration(video);System.out.println("videoDuration = " + duration);}}网上一般说,maven引用如下:org.bytedecojavacv-platform1.5.2结果引用了一大堆包,超过500M,我特意花了不少时间,进行了精减,正确的maven引用如下:org.bytedeco javacv1.5.2org.bytedeco javacpporg.bytedeco openblasorg.bytedeco opencvorg.bytedeco ffmpegorg.bytedeco flycaptureorg.bytedeco libdc1394org.bytedeco libfreenectorg.bytedeco libfreenect2org.bytedeco librealsenseorg.bytedeco librealsense2org.bytedeco videoinputorg.bytedeco artoolkitplusorg.bytedeco flandmarkorg.bytedeco leptonica。

Java调用ffmpeg + menconder 转换视频格式,提取视频缩略图

Java调用ffmpeg + menconder 转换视频格式,提取视频缩略图

import java.io.IOException;import java.io.InputStream;import java.util.List;public class Ffmpeg {public static void main(String[] args) {//视频文件String videoRealPath = "E:\\Eclipse2\\a.avi";//截图的路径(输出路径)String imageRealPath ="E:\\Eclipse2\\atest.jpg";//方法一:调用批处理程序,调用批处理文件ffmpeg.bat转换视频格式// try {// //调用批处理文件// Runtime.getRuntime().exec("cmd /c start C:\\Users\\Administrator\\Desktop\\test\\ffmpeg.bat " + videoRealPath + " " + imageRealPath);// } catch (IOException e) {// // TODO Auto-generated catch block// e.printStackTrace();// }//方法二:通过命令提示符来调用需要添加系统路径(Path),调用menconder 转换视频各种// commendF// .add("cmd.exe /c mencoder E:\\Eclipse2\\test.flv -o e:\\Eclipse2\\test.avi// -oac mp3lame -lameopts cbr:br=32// -ovc x264 -x264encopts bitrate=440 -vf scale=448:-3");//方法三:调用系统中的可执行程序调用ffmpeg 提取视屏缩略图 List<String> commend = new java.util.ArrayList<String>();commend.add("E:\\Eclipse2\\Mplayer\\ffmpeg-git-4082198-win32-static\\ bin\\ffmpeg.exe");commend.add("-i");commend.add(videoRealPath);commend.add("-y");commend.add("-f");commend.add("image2");commend.add("-ss");commend.add("8");commend.add("-t");commend.add("0.001");commend.add("-s");commend.add("350*240");commend.add(imageRealPath);try {ProcessBuilder builder = new ProcessBuilder();mand(commend);builder.redirectErrorStream(true);System.out.println("视频截图开始...");// builder.start();Process process = builder.start();InputStream in = process.getInputStream();byte[] re = new byte[1024];System.out.print("正在进行截图,请稍候");while (in.read(re) != -1) {System.out.print(".");}System.out.println("");in.close();System.out.println("视频截图完成...");} catch (Exception e) {e.printStackTrace();System.out.println("视频截图失败!");}}}。

JavaCV学习(二):使用JavaCV+FFmpeg制作拉流播放器

JavaCV学习(二):使用JavaCV+FFmpeg制作拉流播放器

JavaCV学习(⼆):使⽤JavaCV+FFmpeg制作拉流播放器⼀、前⾔ 在中,我们不断的学习和了解⾳视频相关的知识,随着知识点不断的学习,我们现在应该做的事情,就是将知识点不断的串联起来。

这样才能得到更深层次的领悟。

通过整理我们知道可以使⽤ImageView和SurfaceView甚⾄是View来展⽰图⽚,通过整理我们知道如何播放⾳频原始数据了。

那么可不可以定义为,我们找到了如何播放⾳视频的最基本的⽅式呢?答,当然是的!在⾥,我们接触了⼀次JavaCV,发现⾥⾯提供的API相当丰富,尤其是图形图像处理⽅⾯,那么下⾯我们就基于JavaCV加上它提供的ffmpegAPi⼯具,来完成⼀个基本的拉流播放器的制作,鉴于起名很难,我们先把名字起好:NBPlayer。

⼆、设计⽅案我们要做的是⼀个简单的拉流播放器,需要具备以下功能:1. 将直播流拉取到设备上并展现出来;2. 保证播放当前直播流的⾳视频是同步的;3. 播放视频时可以切换全屏幕与⾮全屏;三、定义播放器的⽣命周期在定义播放器的⽣命周期们需要做到以下两步:1. 先定义⼀下播放器的事件 2. 定义播放器展⽰的控件1. 定义播放器事件因为我们要做的就是⼀个播放器,所以就需要定义出来相应的播放器的事件,最基本的播放器的操作就是:播放、暂停、停⽌。

⽰例代码如下:/*** 播放器抽象类*/public abstract class Player {protected boolean play = false;public void play() {this.play = true;}public void pause() {this.play = false;}public void stop() {this.play = false;}}2. 定义播放器展⽰的控件 - SurfaceView为什么定义完播放器的操作事件之后,就去定义播放器展⽰的控件呢?答:主要是因为我们做的播放器在展⽰控件⽅⾯的思路上和Android原⽣的MediaPlayer及Ijkplayer是⼀样的,都是监听Surface的状态来控制播放器什么时候创建,什么时候暂停,什么时候停⽌并release。

【Java】java使用ffmpeg实现视频切割

【Java】java使用ffmpeg实现视频切割

【Java】java使⽤ffmpeg实现视频切割需求:将已经录制好的视频,从固定时间开始截取,到固定时间结束.并且将视频截取成相对平均的若⼲段视频1.⾸先需要安装FFmpeg.2.代码//分割视频的⼤⼩private long blockSize = 1 * 1024 * 1024;@Testpublic void Test1() throws Exception {List<String> lists = cutVideo("/Users/wangge/Desktop/erge.mp4");System.out.println(lists);}视频切割规则计算,切割命令组装/*** @param filePath 要处理的⽂件路径* @return分割后的⽂件路径* @throws Exception ⽂件*/List<String> cutVideo(String filePath) throws Exception {File file = new File(filePath);if (!file.exists()) {throw new FileNotFoundException(filePath + "⽂件不存在");}if (!filePath.endsWith(".mp4")) {throw new Exception("⽂件格式错误");}//从ffmpeg获得的时间长度00:00:00格式String videoTimeString = getVideoTime(file);("从ffmpeg获得的时间长度00:00:00格式:{}",videoTimeString);//将时长转换为秒数int videoSecond = parseTimeToSecond(videoTimeString);("将时长转换为秒数:{}",videoSecond);//视频⽂件的⼤⼩long fileLength = getVideoFileLength(file);("视频⽂件的⼤⼩:{}",fileLength);List<String> cutedVideoPaths = new ArrayList<String>();if (fileLength <= blockSize) {("如果视频⽂件⼤⼩不⼤于预设值,则直接返回原视频⽂件");cutedVideoPaths.add(filePath);} else {("超过预设⼤⼩,需要切割");int partNum = (int) (fileLength / blockSize);("⽂件⼤⼩除以分块⼤⼩的商:{}",partNum);long remainSize = fileLength % blockSize;("余数:{}",remainSize);int cutNum;if (remainSize > 0) {cutNum = partNum + 1;} else {cutNum = partNum;}("cutNum:{}",cutNum);int eachPartTime = videoSecond / cutNum;("eachPartTime:{}",eachPartTime);String fileFolder = file.getParentFile().getAbsolutePath();("fileFolder:{}",fileFolder);String fileName[] = file.getName().split("\\.");("fileName[]:{}",fileName);for (int i = 0; i < cutNum; i++) {List<String> commands = Lists.newArrayList();commands.add("ffmpeg");commands.add("-ss");commands.add(parseTimeToString(eachPartTime * i));if (i != cutNum - 1) {commands.add("-t");commands.add(parseTimeToString(eachPartTime));}commands.add("-i");commands.add(filePath);commands.add("-codec");commands.add("copy");commands.add(fileFolder + File.separator + fileName[0] + "_part" + i + "." + fileName[1]);cutedVideoPaths.add(fileFolder + File.separator + fileName[0] + "_part" + i + "." + fileName[1]);newRunCommand(commands);}}return cutedVideoPaths;}开始逐条执⾏命令private Result newRunCommand(List<String> command) {("相关命令 command:{}",command);Result result = new Result(false, "");ProcessBuilder builder = new ProcessBuilder(command);builder.redirectErrorStream(true);try {Process process = builder.start();final StringBuilder stringBuilder = new StringBuilder();final InputStream inputStream = process.getInputStream();BufferedReader reader = new BufferedReader(new InputStreamReader(inputStream)); String line;while ((line = reader.readLine()) != null) {stringBuilder.append(line);}while ((line = reader.readLine()) != null){}if (reader != null) {reader.close();}if (inputStream != null) {inputStream.close();}} catch (Exception e) {throw new RuntimeException("ffmpeg执⾏异常" + e.getMessage());}return result;}⼯具类相关:/*** 获取视频⽂件时长** @param file ⽂件* @return时长格式hh:MM:ss* @throws FileNotFoundException 视频不存在抛出此异常*/private String getVideoTime(File file) throws FileNotFoundException {if (!file.exists()) {throw new FileNotFoundException(file.getAbsolutePath() + "不存在");}List<String> commands = new ArrayList<String>();commands.add("ffmpeg");commands.add("-i");commands.add(file.getAbsolutePath());Result result = runCommand(commands);String msg = result.getMsg();if (result.isSuccess()) {Pattern pattern = pile("\\d{2}:\\d{2}:\\d{2}");Matcher matcher = pattern.matcher(msg);String time = "";while (matcher.find()) {time = matcher.group();}return time;} else {return "";}}/*** 获取⽂件⼤⼩** @param file 去的⽂件长度,单位为字节b* @return⽂件长度的字节数* @throws FileNotFoundException ⽂件未找到异常*/private long getVideoFileLength(File file) throws FileNotFoundException {if (!file.exists()) {throw new FileNotFoundException(file.getAbsolutePath() + "不存在");}return file.length();}/*** 将字符串时间格式转换为整型,以秒为单位** @param timeString 字符串时间时长* @return时间所对应的秒数*/private int parseTimeToSecond(String timeString) {Pattern pattern = pile("\\d{2}:\\d{2}:\\d{2}");Matcher matcher = pattern.matcher(timeString);if (!matcher.matches()) {try {throw new Exception("时间格式不正确");} catch (Exception e) {e.printStackTrace();}}String[] time = timeString.split(":");return Integer.parseInt(time[0]) * 3600 + Integer.parseInt(time[1]) * 60 + Integer.parseInt(time[2]); }/*** 将秒表⽰时长转为00:00:00格式** @param second 秒数时长* @return字符串格式时长*/private String parseTimeToString(int second) {int end = second % 60;int mid = second / 60;if (mid < 60) {return mid + ":" + end;} else if (mid == 60) {return "1:00:" + end;} else {int first = mid / 60;mid = mid % 60;return first + ":" + mid + ":" + end;}}public class Result {private boolean success;private String msg;public Result(boolean success, String msg) {this.success = success;this.msg = msg;}public Result() {}public boolean isSuccess() {return success;}public void setSuccess(boolean success) {this.success = success;}public String getMsg() {return msg;}public void setMsg(String msg) {this.msg = msg;}}。

使用ffmpeg快速生成视频截图

使用ffmpeg快速生成视频截图

使⽤ffmpeg快速⽣成视频截图由于项⽬的需求, 我需要对单个视频进⾏截图. 以前我使⽤的ffmpeg命令是这样的:ffmpeg -i input.mkv -ss 00:10:00 -f image2 output.jpg但是这个命令会花费相当长的时间. 对⼀个清晰的或者较⼤的视频⽂件进⾏操作, 会花费半分钟以上. 截图的时间越往后, 花费的时间也越长.更为悲剧的是, 我的Nginx服务器会在等待15s之后返回 "504 Bad Gateway" 的错误, 尽管后台的截图操作仍然在进⾏中! 这真的不能忍受, ⽽且会给⽤户带来不好的体验. 试着上⽹搜了⼀下解决⽅案, 看到了博客 [1] . ⼤意是说, 出现这种情况的原因是由于参数的位置放置不正确造成的 "-ss" 要放在第⼀个参数位置. 调整它们的位置之后我再次尝试 ( test1.flv是⼀个h264编码的⾼清视频, 总时长为"00:04:11.37", 命令中 "-ss 00:02:06" 相当于在总长度的⼀半处截图) :$ time ffmpeg -ss 00:02:06 -i test1.flv -f image2 -y test1.jpg奇迹出现了, 这⼀次⽤时不超过⼀秒钟:real 0m0.595suser 0m0.416ssys 0m0.092s真的是⼤⼤缩短了截图时间!!.⾄于原因是什么, 我也搞不懂, 也许是像 [1] 中所说的: "可能是ffmpeg看到第⼀个参数为 -ss的时候,马上跳转到时间线为指定的地⽅然后再打开视频⽂件进⾏处理,⽽如果最后看到的参数是-ss,先打开视频,然后慢慢往后遍历,直到遍历到时间为指定处. 通过观察ffmpeg的输出发现,实际处理的时候⼏乎就是这样。

"参考⽂献:。

javacv ffmpegframefilter 参数说明

javacv ffmpegframefilter 参数说明

javacv ffmpegframefilter 参数说明标题:JavaCV FFmpegFrameFilter 参数说明引言:JavaCV 是一个基于 Java 的计算机视觉和人工智能库,它提供了与 OpenCV 和FFmpeg 等流行库的 Java 接口。

其中,FFmpegFrameFilter 是 JavaCV 中一个重要的类,它用于在视频处理过程中应用 FFmpeg 滤镜。

本文将详细介绍FFmpegFrameFilter 的参数说明,以帮助读者更好地理解和使用该类。

正文内容:1. FFmpegFrameFilter 的基本概述1.1 FFmpegFrameFilter 的作用FFmpegFrameFilter 是一个用于应用 FFmpeg 滤镜的类。

它可以在视频处理过程中对帧进行滤镜处理,如添加水印、调整亮度、对比度等。

1.2 FFmpegFrameFilter 的使用要求在使用 FFmpegFrameFilter 之前,需要确保已经正确安装了 FFmpeg 库,并且在 Java 项目中引入了 JavaCV 库。

2. FFmpegFrameFilter 的参数说明2.1 setInputFormat(String format)该方法用于设置输入视频的格式。

参数 format 是一个字符串,表示视频的格式,如"mp4"、"avi"等。

2.2 setOutputFormat(String format)该方法用于设置输出视频的格式。

参数 format 同样是一个字符串,表示视频的格式。

2.3 setFilters(String filters)该方法用于设置要应用的滤镜。

参数 filters 是一个字符串,表示要应用的滤镜的名称和参数,如"drawtext=text='Hello World':fontsize=24"表示添加一个文本水印。

javacv中ffmpegframegrabber使用时的一些注意事项

javacv中ffmpegframegrabber使用时的一些注意事项

javacv中ffmpegframegrabber使用时的一些注意事项在使用javacv库中的FFmpegFrameGrabber进行视频帧的抓取时,有一些注意事项需要注意。

下面是一些常见的问题和解决方法,以帮助您更好地使用FFmpegFrameGrabber。

1. 确保安装了FFmpeg库:FFmpegFrameGrabber依赖于FFmpeg库来处理视频文件。

在开始使用之前,请确保已经安装了FFmpeg库,并在Java项目中正确配置了库文件路径。

2. 理解视频帧的时间戳:FFmpegFrameGrabber可以以帧为单位捕获视频的时间戳。

在处理视频帧时,您需要根据时间戳执行适当的操作,例如跳过或处理特定的帧。

3. 设置视频源:在创建FFmpegFrameGrabber对象时,需要设置视频源。

可以是视频文件的路径、URL或其他类型的输入源。

4. 设置视频帧的宽度和高度:通过grabber对象的setWidth和setHeight方法,您可以设置抓取的视频帧的宽度和高度。

默认情况下,它们将被设置为视频源的宽度和高度。

5. 设置视频帧的像素格式:使用setPixelFormat方法可以设置抓取的视频帧的像素格式。

不同的像素格式将影响图像的质量和大小。

通常,推荐使用BGR24或GRAY格式。

6. 抓取视频帧:通过调用grab方法,可以抓取视频源中的下一帧。

在调用grab方法之前,请确保已经启动了grabber对象。

7. 读取抓取的视频帧:调用grabber对象的grab方法后,可以使用getFrame方法来获取抓取的视频帧。

请注意,getFrame方法可能返回null,表示已经抓取完所有的帧。

8. 解码抓取的视频帧:获取抓取的视频帧后,可以使用grabber对象的convert方法将其解码为Java的BufferedImage。

使用BufferedImage可以方便地进行图像处理和分析。

9. 释放资源:在使用完FFmpegFrameGrabber后,应该及时释放资源。

javacv 中 ffmpegframegrabber 使用时的一些注意事项

javacv 中 ffmpegframegrabber 使用时的一些注意事项

javacv 中ffmpegframegrabber 使用时的一些注意事项摘要:1.介绍javacv和ffmpegframegrabber2.使用ffmpegframegrabber时需要注意的事项a.确保ffmpeg的安装和配置b.设置正确的视频格式和参数c.处理视频流中的异常情况d.优化性能和内存使用e.了解和处理相关版权问题3.总结和建议正文:javacv是一个用于处理多媒体数据的Java库,它能够通过使用FFmpeg 这个强大的开源工具来进行多媒体格式的转换、处理和分析。

在javacv中,我们可以使用ffmpegframegrabber这个类来方便地获取和处理视频数据。

但是,在使用ffmpegframegrabber时,我们也需要注意以下一些事项。

首先,我们需要确保已经正确安装和配置了FFmpeg。

FFmpeg的安装过程可能较为复杂,需要根据不同的操作系统和硬件环境进行相应的配置。

在安装完成后,我们还需要检查FFmpeg的环境变量设置,确保javacv能够找到FFmpeg的可执行文件。

其次,我们需要设置正确的视频格式和参数。

在使用ffmpegframegrabber时,我们需要指定视频文件的路径以及视频的格式和参数。

这些参数包括视频的分辨率、帧率、编码格式等。

设置正确的参数可以确保我们正确地获取和处理视频数据,避免出现格式不匹配或数据损坏等问题。

此外,我们还需要处理视频流中的异常情况。

在使用ffmpegframegrabber时,可能会遇到视频流不完整、数据损坏等问题。

这时,我们需要能够识别并处理这些异常情况,例如通过重试获取数据或使用备份数据源等方法。

同时,为了提高性能和减少内存使用,我们还可以对ffmpegframegrabber进行一些优化。

例如,我们可以使用ffmpegframegrabber的异步模式来避免阻塞主线程,我们还可以合理设置缓冲区大小以减少内存占用。

最后,我们需要了解并遵守与FFmpeg相关的版权政策。

ffmpeg对视频进行缩放和裁剪操作

ffmpeg对视频进行缩放和裁剪操作

ffmpeg对视频进⾏缩放和裁剪操作使⽤ffmpeg进⾏放⼤和缩⼩视频⽤的是scale过滤器# 将视频缩⼩到宽200⾼100ffmpeg -i test.mp4 -vf scale=w=200:h=100 "C:\Users\amin\Desktop\test2.mp4"vf表⽰视频过滤器(video filter),该操作中由于宽⾼⽐和原来的视频不同,会造成像素的宽⾼⽐不同如果想要保持原来的宽⾼⽐,可以传递-1作为参数,使⽤iw和ih分别表⽰原来视频的宽度和⾼度。

如下指令⽣成的视频的宽度为原来的1.5倍,但是限制视频的最⼤宽度为5000像素。

参数解释:min 的意思就是取最⼩的,如果设置的宽度⼤于5000就取最⼩的5000ffmpeg -i test.mp4 -vf scale=w='min(5000,iw*1.5)':h=1280 "C:\Users\amin\Desktop\test2.mp4"# 同理,限制视频宽度最⼩多少ffmpeg -i test.mp4 -vf scale=w='max(1920,iw*1)':h=-1 "C:\Users\amin\Desktop\test2.mp4"如果只想设置宽度,同时保持原来的宽⾼⽐ffmpeg -i test.mp4 -vf scale=w='min(5000,iw*1.5)':h=-1 "C:\Users\amin\Desktop\test2.mp4"同理设置⾼也⼀样ffmpeg -i test.mp4 -vf scale=w=-1:h='min(720,ih*1)'"C:\Users\amin\Desktop\test2.mp4"裁剪视频裁剪的意思就是从原来的视频中截取矩形区域⽣成新视频,需要⽤到crop过滤器iw表⽰输⼊视频的宽度。

Java实现对视频进行截图的方法【附ffmpeg下载】

Java实现对视频进行截图的方法【附ffmpeg下载】

Java实现对视频进⾏截图的⽅法【附ffmpeg下载】本⽂实例讲述了Java实现对视频进⾏截图的⽅法。

分享给⼤家供⼤家参考,具体如下:之前介绍过,这⾥演⽰⼀下ffmpeg进⾏视频截图的⽅法。

具体代码如下:import java.io.File;import java.util.List;//⽣成视频⽂件的⾸帧为图⽚//windows下的版本public class CreatePh {// public static final String FFMPEG_PATH = "E:/ffmpeg/ffmpeg.exe";public static boolean processImg(String veido_path, String ffmpeg_path) {File file = new File(veido_path);if (!file.exists()) {System.err.println("路径[" + veido_path + "]对应的视频⽂件不存在!");return false;}List<String> commands = new java.util.ArrayList<String>();commands.add(ffmpeg_path);commands.add("-i");commands.add(veido_path);commands.add("-y");commands.add("-f");commands.add("image2");commands.add("-ss");commands.add("8");// 这个参数是设置截取视频多少秒时的画⾯// commands.add("-t");// commands.add("0.001");commands.add("-s");commands.add("700x525");commands.add(veido_path.substring(0, veido_stIndexOf(".")).replaceFirst("vedio", "file") + ".jpg");try {ProcessBuilder builder = new ProcessBuilder();mand(commands);builder.start();System.out.println("截取成功");return true;} catch (Exception e) {e.printStackTrace();return false;}}public static void main(String[] args) {processImg("C:/video1.avi", "C:/ffmpeg.exe");}}运⾏后的截图如下:附:ffmpeg.exe点击此处。

使用ffmpeg进行视频截图

使用ffmpeg进行视频截图

使⽤ffmpeg进⾏视频截图
2、下载后解压压缩包,得到如下左图的⽂件。

然后打开bin⽂件夹,可以看到3个.exe⽂件。

-------->>>>>>
3、打开命令⾏窗⼝,使⽤cd命令跳转到这个bin⽂件⽬录下,主要就是要跳转到包含ffmpeg.exe的⽬录⾥。

(注:另⼀种⽅法是将该bin⽂件夹⽬录(如我的是C:\Users\xiejisong\Desktop\ffmpeg-4.0.2-win64-static\bin)添加到系统环境变量Path中,则使⽤时就不⽤每次都需要跳转到这个⽂件⽬录下,⽽是直接打开cmd然后ffmpeg就能执⾏ffmpeg.exe)
4、然后从视频中提取图⽚的命令如下:
ffmpeg -i [视频路径] -r 1 -q:v 2 -f image2 image-%d.jpeg
视频路径:如 "myvideo.mp4"(这时这个视频也在bin⽂件⽬录下才可以直接这么写),或者完整路径的
-r:每秒提取的帧数,如上⾯为每秒1帧,即⼀张图像
-q:v :图⽚质量
-f:图⽚格式,上述为image2
image-%d.jpeg:⽣成图像的⽂件名,可以加上完整路径,%d会使⽂件名按整数编号,如上述⽣成图像为image-1.jpeg, image-2.jpeg, ...
还有其他参数:
-t:持续时间,如-t 4表⽰持续4s
-ss:起始时间,如-ss 01:30:14,从01:30:14开始
-vframes:指定抽取的帧数,如-vframes 120,指定抽取120张
-s:格式⼤⼩,如-s 640x360
-y:覆盖,直接使⽤。

javacv视频抽帧的实现过程详解(附代码)

javacv视频抽帧的实现过程详解(附代码)

javacv视频抽帧的实现过程详解(附代码)视频抽帧可以做⼀些处理,⽐如⽔印,去⽔印等操作,然后再合成视频。

下⾯直接上代码:引⼊maven步骤看这⾥直接上关键操作:/*** 视频⽂件指定时间段的帧截取* @param file* @param start* @param end*/public static List<File> videoIntercept(File file, Integer start, Integer end) {Frame frame = null;List<File> files = Lists.newArrayList();FFmpegFrameGrabber fFmpegFrameGrabber = new FFmpegFrameGrabber(file);String filePath = "D://video//images//";String fileTargetName = "movie";try {fFmpegFrameGrabber.start();int ftp = fFmpegFrameGrabber.getLengthInFrames();System.out.println("开始视频提取帧");for (int i=0 ; i < ftp ; i++){if( i >= start && i <= end){frame = fFmpegFrameGrabber.grabImage();doExecuteFrame(frame, filePath, fileTargetName, i ,files);}}System.out.println("============运⾏结束============");fFmpegFrameGrabber.stop();} catch (IOException E) {// Loggers.ERROR.error("视频抽帧异常", e);}return files;}public static void doExecuteFrame(Frame frame, String targetFilePath, String targetFileName, int index ,List<File> files) {if ( frame == null || frame.image == null) {return;}Java2DFrameConverter converter = new Java2DFrameConverter();String imageMat = "jpg";String fileName = targetFilePath + targetFileName + "_" + index + "." + imageMat;BufferedImage bi = converter.getBufferedImage(frame);File output = new File(fileName);files.add(output);try{ImageIO.write(bi, imageMat, output);} catch (IOException e) {e.printStackTrace();}}public static void main(String[] args) {List<File> files = videoIntercept(new File("D://video//1553583033205-480p.mp4"), 10, 20);System.out.println(files);}我们可以看到⽂件夹下抽取了视频的第10,20之间的帧。

javacv 按帧生成文件 简书

javacv 按帧生成文件 简书

`javacv`是一个Java的开源库,用于视频和图像处理。

它也可以用来按帧提取视频并保存为文件。

以下是一个简单的示例,使用`javacv`按帧提取视频并保存为图片:```javaimport org.bytedeco.javacv.*;import org.bytedeco.opencv.opencv_core.*;public class FrameExtractor {public static void main(String[] args) throws FrameGrabber.Exception, FrameRecorder.Exception {// 创建一个FrameGrabber对象来捕获视频FFmpegFrameGrabber grabber = new FFmpegFrameGrabber("input.mp4");// 初始化grabbergrabber.start();// 创建一个FrameRecorder对象来保存视频FFmpegFrameRecorder recorder = new FFmpegFrameRecorder("output.avi", grabber.getImageWidth(),grabber.getImageHeight());// 设置帧率recorder.setFrameRate(grabber.getFrameRate());// 开始录制recorder.start();// 创建一个Frame对象用于存储每一帧Frame frame;while ((frame = grabber.grabFrame()) != null) {// 将Frame对象转化为OpenCV中的Mat对象Mat mat = new OpenCVFrameConverter.ToMat().convert(frame);// 将Mat对象保存为图片Imgcodecs.imwrite("frame" + frame.index() + ".png", mat);// 将此帧写入到输出视频流recorder.record(frame);}// 停止录制和抓取recorder.stop();grabber.stop();}}```这个程序会从名为"input.mp4"的视频文件中提取每一帧,并将它们以png格式保存为名为"frameX.png"的文件,其中X是帧的索引。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
<artifactId>ffmpeg</artifactId>
</exclusion>
<exclusion>
<groupId>org.bytedeco</groupId>
<artifactId>javacpp</artifactId>
</exclusion>
<exclusion>
<groupId>org.bytedeco</groupId>
<artifactId>libfreenect</artifactId>
</exclusion>
<exclusion>
<groupId>org.bytedeco</groupId>
<artifactId>libdc1394</artifactId>
</exclusion>
<exclusion>
<groupId>org.bytedeco</groupId>
i++;
}
// 截取的帧图片
Java2DFrameConverter converter = new Java2DFrameConverter();
BufferedImage srcImage = converter.getBufferedImage(frame);
<artifactId>librealsense</artifactId>
</exclusion>
<exclusion>
<groupId>org.bytedeco</groupId>
ImageIO.write(thumbnailImage, "jpg", picFile);
ff.stop();
} catch (IOException e) {
e.printStackTrace();
<artifactId>flycapture</artifactId>
</exclusion>
<exclusion>
<groupId>org.bytedeco</groupId>
File video = new File(videoPath);
String picPath = "d:\\video.jpg";
getVideoPic(video, picPath);
long duration = getVideoDuration(video);
<artifactId>openblas</artifactId>
</exclusion>
<exclusion>
<groupId>org.bytedeco</groupId>
<version>1.5.2</version>
</dependency>
结果引用了一大堆包,超过500M,我特意花了不少时间,进行了精减,正确的maven引用如下:
<!-- 视频操作引用包 begin -->
<dependency>
<groupId>org.bytedeco</groupId>
thumbnailImage.getGraphics().drawImage(srcImage.getScaledInstance(width, height, Image.SCALE_SMOOTH), 0, 0, null);
File picFile = new File(picPath);
<artifactId>libfreenect2</artifactId>
</exclusion>
<exclusion>
<groupId>org.bytedeco</groupId>
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;
public class VideoUtil {
static Logger log = LoggerFactory.getLogger(VideoUtil.class);
/**
* 获取视频时长,单位为秒
*
* @param video 源视频文件
* @return 时长(s)
*/
public static Long getVideoDuration(File video) {
Long duration = 0L;
<artifactId>librealsense2</artifactId>
</exclusion>
<exclusion>
FFmpegFrameGrabber ff = new FFmpegFrameGrabber(video);
try {
ff.start();
duration = ff.getLengthInTime() / (1000 * 1000);
java利用javacv和ffmpeg截取视频提取视频封面,精减引用包
废话少说,直接上代码:
package mons.util;
import org.bytedeco.javacv.FFmpegFrameGrabber;
import org.bytedeco.javacv.FrameGrabber;
}
}
public static void main(String[] args) {
String videoPath ="d:\\111.mp4";
// String audioPath = "d:\\20200222_161159.m4a";
import org.bytedeco.javacv.Java2DFrameConverter;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import javax.imageio.ImageIO;
import java.awt.*;
int height = (int) (((double) width / srcImageWidth) * srcImageHeight);
BufferedImage thumbnailImage = new BufferedImage(width, height, BufferedImage.TYPE_3BYTE_BGR);
FFmpegFrameGrabber ff = new FFmpegFrameGrabber(video);
try {
ff.start();
// 截取中间帧图片(具体依实际情况而定)
int i = 0;
* 截取视频获得指定帧的图片
*
* @param video 源视频文件
* @param picPath 截图存放路径
*/
public static void getVideoPic(File video, String picPath) {
int length = ff.getLengthInFrames();
int middleFrame = length / 2;
org.bytedeco.javacv.Frame frame = null;
while (i < length) {
int srcImageWidth = srcImage.getWidth();
int srcImageHeight = srcImage.getHeight();
// 对截图进行等比例缩放(缩略图)
int width = 480;
frame = ff.grabFrame();
if ((i > middleFrame) && (frame.image != null)) {
break;
}
<artifactId>opencv</artifactId>
</exclusion>
<exclusion>
<groupId>org.bytedeco</groupId>
ff.stop();
} catch (FrameGrabber.Exception e) {
e.printStackTrace();
}
return duration;
}
/**
System.out.println("videoDuration = " + duration);
}
}
网上一般说,maven引用如下:
<dependency>
<groupId>org.bytedeco</groupId>
相关文档
最新文档