重庆分公司,新征程启航
为企业提供网站建设、域名注册、服务器等服务
小编给大家分享一下Java怎样获取视频时长及截取帧截图,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!
成都创新互联公司专注为客户提供全方位的互联网综合服务,包含不限于成都网站设计、成都做网站、邹平网络推广、小程序开发、邹平网络营销、邹平企业策划、邹平品牌公关、搜索引擎seo、人物专访、企业宣传片、企业代运营等,从售前售中售后,我们都将竭诚为您服务,您的肯定,是我们最大的嘉奖;成都创新互联公司为所有大学生创业者提供邹平建站搭建服务,24小时服务热线:18982081108,官方网址:www.cdcxhl.com
示例
添加依赖
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", 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); }
以上是“Java怎样获取视频时长及截取帧截图”这篇文章的所有内容,感谢各位的阅读!相信大家都有了一定的了解,希望分享的内容对大家有所帮助,如果还想学习更多知识,欢迎关注创新互联行业资讯频道!