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(发邮件时,请将#更换为@)进行举报,并提供相关证据,一经查实,本站将立刻删除涉嫌侵权内容。