当前位置: 首页 > 后端技术 > Java

javaCV视频工具——截取视频缩略图,获取视频属性

时间:2023-04-01 17:07:57 Java

@TOC目录介绍通过javaCV视频工具-抓取视频缩略图,获取视频属性依赖导入org.bytedecojavacv-platform1.5实现@Slf4jpublicclassVideoUtils{privatestaticfinalStringIMAGEMAT="png";私人静态最终字符串旋转=“旋转”;/***默认是抓取视频的中间帧用于封面*/publicstaticfinalintMOD=2;/***视频缩略图后缀*/privatestaticfinalStringVIDEO_THUMBNAIL_SUF="th.png";/***视频缩略图前缀*/privatestaticfinalStringVIDEO_THUMBNAIL_PRE="video/thumbnail/";privatestaticfinalStringSYMBOL=".";/***获取视频缩略图*@paramfilePath:视频路径*@parammod:获取第一帧的视频长度/mod*@throwsException*/publicstaticStringrandomGrabberFFmpegImage(StringfilePath,intmod){StringtargetFilePath="";尝试{FFmpegFrameGrabberff=FFmpegFrameGrabber.createDefault(文件路径);ff.开始();//图片位置是否正确Stringrotate=ff.getVideoMetadata(ROTATE);//获取帧数intffLength=ff.getLengthInFrames();帧f;诠释我=0;//设置截取参数intindex=ffLength/mod;while(i1){OpenCVFrameConverter.ToIplImageconverter=newOpenCVFrameConverter.ToIplImage();IplImagesrc=converter.convert(f);f=converter.convert(旋转(src,Integer.parseInt(旋转)));}targetFilePath=getImagePath(filePath,i);doExecuteFrame(f,targetFilePath);休息;}我++;}ff.stop();}catch(Exceptione){log.error("获取视频缩略图异常:"+e.getMessage());}返回目标文件路径;}/***随机生成一个缩略图存储路径*@paramfilePath:视频路径*@paramindex:前几帧*@return:缩略图的存储路径*/privatestaticStringgetImagePath(StringfilePath,intindex){StringfileName=FileUtils.getName(文件路径);//去掉后缀fileName=fileName.substring(0,fileName.indexOf(SYMBOL));returnTencentCosConfig.baseUrl+VIDEO_THUMBNAIL_PRE+DateUtils.datePath()+"/"+fileName+"_"+index+VIDEO_THUMBNAIL_SUF;}/***旋转图像*@paramsrc*@paramangle*@return*/publicstaticIplImagerotate(IplImagesrc,intangle){IplImageimg=IplImage.create(src.height(),src.width(),src.depth(),src.nChannels());opencv_core.cvTranspose(src,img);opencv_core.cvFlip(img,img,角度);返回我毫克;}/***截取缩略图*@paramf*@paramtargerFilePath:封面图*/publicstaticvoiddoExecuteFrame(Framef,StringtargerFilePath){COSClientcosClient=TencentCosUtils.initCosClient();如果(null==f||null==f.image){返回;}Java2DFrameConverter转换器=newJava2DFrameConverter();BufferedImagebi=converter.getBufferedImage(f);ByteArrayOutputStreamout=newByteArrayOutputStream();试试{ImageIO.write(bi,IMAGEMAT,out);//获取文件流InputStreambufferedImage=newByteArrayInputStream(out.toByteArray());intlength=out.size();ObjectMetadataobjectMetadata=newObjectMetadata();//从输入流上传必须指定内容长度,否则http客户端可能缓存所有数据,出现内存OOM情况objectMetadata.setContentLength(length);//默认情况下,下载时根据cos路径key的后缀返回response的contenttype,上传时设置contenttype会覆盖PutObjectReques的默认值tputObjectRequest=newPutObjectRequest(TencentCosConfig.bucket,targerFilePath,bufferedImage,objectMetadata);PutObjectResultputObjectResult=cosClient.putObject(putObjectRequest);log.info("腾讯COS成功上传视频缩略图:{}",putObjectResult.getETag());//关闭输入输出流bufferedImage.close();关闭();}catch(IOExceptione){e.printStackTrace();}最后{cosClient.shutdown();/***根据视频长度随机生成一个随机数集*@parambaseNum:基数,这里是视频的长度*@paramlength:随机数集的长度*@return:随机数集*/publicstaticListrandom(intbaseNum,intlength){Listlist=newArrayList(length);while(list.size()