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

http://www.cppcns.comtedeco.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

&http://www.cppcns.comlt;artifactId>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 (FrameGrabwww.cppcns.comber.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", picFile);

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);

}

示例源码

以上就是本文的全部内容,希望对大家VipDEXRrE的学习有所帮助,也希望大家多多支持我们。

本文标题: Java获取视频时长及截取帧截图详解

本文地址: http://www.cppcns.com/ruanjian/java/263964.html

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值