您好,欢迎来到意榕旅游网。
搜索
您的当前位置:首页Java获取视频时长及截取帧截图详解

Java获取视频时长及截取帧截图详解

来源:意榕旅游网
Java获取视频时长及截取帧截图详解

前⾔

只是最近碰到有这⽅⾯的项⽬需求,所以简单 Mark 下本⽂。下⾯的⽰例是参考过他⼈分享的⽂章,之后本⼈再⾃⾏实践、调整和测试过的,希望对有这⽅⾯需求的⼈有所帮助。⽰例添加依赖

org.bytedeco

javacv-platform 1.4.4

上述这段 maven 依赖包含了完整的 javacv 功能 (⾮常多,依赖Jar就占⼤概有500MB),由于这⾥只使⽤到了其中 ffmpeg 这块的特性,因此也可以像下⾯这样排除掉⽆关的部分

org.bytedeco javacv 1.4.4

org.bytedeco javacpp

org.bytedeco.javacpp-presets flycapture

org.bytedeco.javacpp-presets libdc1394

org.bytedeco.javacpp-presets libfreenect

org.bytedeco.javacpp-presets libfreenect2

org.bytedeco.javacpp-presets librealsense

org.bytedeco.javacpp-presets videoinput

org.bytedeco.javacpp-presets opencv

org.bytedeco.javacpp-presets tesseract

org.bytedeco.javacpp-presets leptonica

org.bytedeco.javacpp-presets flandmark

org.bytedeco.javacpp-presets artoolkitplus

org.bytedeco

javacv-platform 1.4.4

org.bytedeco javacv

org.bytedeco.javacpp-presets flycapture-platform

org.bytedeco.javacpp-presets libdc1394-platform

org.bytedeco.javacpp-presets libfreenect-platform

org.bytedeco.javacpp-presets libfreenect2-platform

org.bytedeco.javacpp-presets librealsense-platform

org.bytedeco.javacpp-presets videoinput-platform

org.bytedeco.javacpp-presets opencv-platform

org.bytedeco.javacpp-presets tesseract-platform

org.bytedeco.javacpp-presets leptonica-platform

org.bytedeco.javacpp-presets flandmark-platform

org.bytedeco.javacpp-presets artoolkitplus-platform

核⼼代码获取视频时长

/**

* 获取视频时长,单位为秒 *

* @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; 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.getScaledInstance(width, height, Image.SCALE_SMOOTH), 0, 0, null); File picFile = new File(picPath);

ImageIO.write(thumbnailImage, \"jpg\ ff.stop();

} catch (IOException e) { e.printStackTrace(); } }

测试⽤例

public static void main(String[] args) {

String videoPath = ResourceUtils.CLASSPATH_URL_PREFIX + \"video.mp4\"; File video = null; try {

video = ResourceUtils.getFile(videoPath); } catch (FileNotFoundException e) { e.printStackTrace(); }

String picPath = \"video.jpg\"; getVideoPic(video, picPath);

long duration = getVideoDuration(video);

System.out.println(\"videoDuration = \" + duration); }

以上就是本⽂的全部内容,希望对⼤家的学习有所帮助,也希望⼤家多多⽀持。

因篇幅问题不能全部显示,请点此查看更多更全内容

Copyright © 2019- yrrf.cn 版权所有 赣ICP备2024042794号-2

违法及侵权请联系:TEL:199 1889 7713 E-MAIL:2724546146@qq.com

本站由北京市万商天勤律师事务所王兴未律师提供法律服务