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
核心代码
获取视频时长
/** *获取视频时长,单位为秒 * *@paramvideo源视频文件 *@return时长(s) */ publicstaticlonggetVideoDuration(Filevideo){ longduration=0L; FFmpegFrameGrabberff=newFFmpegFrameGrabber(video); try{ ff.start(); duration=ff.getLengthInTime()/(1000*1000); ff.stop(); }catch(FrameGrabber.Exceptione){ e.printStackTrace(); } returnduration; }
截取视频指定帧为图片
/** *截取视频获得指定帧的图片 * *@paramvideo源视频文件 *@parampicPath截图存放路径 */ publicstaticvoidgetVideoPic(Filevideo,StringpicPath){ FFmpegFrameGrabberff=newFFmpegFrameGrabber(video); try{ ff.start(); //截取中间帧图片(具体依实际情况而定) inti=0; intlength=ff.getLengthInFrames(); intmiddleFrame=length/2; Frameframe=null; while(imiddleFrame)&&(frame.image!=null)){ break; } i++; } //截取的帧图片 Java2DFrameConverterconverter=newJava2DFrameConverter(); BufferedImagesrcImage=converter.getBufferedImage(frame); intsrcImageWidth=srcImage.getWidth(); intsrcImageHeight=srcImage.getHeight(); //对截图进行等比例缩放(缩略图) intwidth=480; intheight=(int)(((double)width/srcImageWidth)*srcImageHeight); BufferedImagethumbnailImage=newBufferedImage(width,height,BufferedImage.TYPE_3BYTE_BGR); thumbnailImage.getGraphics().drawImage(srcImage.getScaledInstance(width,height,Image.SCALE_SMOOTH),0,0,null); FilepicFile=newFile(picPath); ImageIO.write(thumbnailImage,"jpg",picFile); ff.stop(); }catch(IOExceptione){ e.printStackTrace(); } }
测试用例
publicstaticvoidmain(String[]args){ StringvideoPath=ResourceUtils.CLASSPATH_URL_PREFIX+"video.mp4"; Filevideo=null; try{ video=ResourceUtils.getFile(videoPath); }catch(FileNotFoundExceptione){ e.printStackTrace(); } StringpicPath="video.jpg"; getVideoPic(video,picPath); longduration=getVideoDuration(video); System.out.println("videoDuration="+duration); }
示例源码
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持毛票票。
声明:本文内容来源于网络,版权归原作者所有,内容由互联网用户自发贡献自行上传,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任。如果您发现有涉嫌版权的内容,欢迎发送邮件至:czq8825#qq.com(发邮件时,请将#更换为@)进行举报,并提供相关证据,一经查实,本站将立刻删除涉嫌侵权内容。