文件笔记之javaCV 视频工具|获取视频时长|缩略图
文件笔记之javaCV 视频工具|获取视频时长|缩略图)
- 目录
- 简介
- 依赖引入
- 实现
目录
简介
通过javaCV 视频工具—截取视频缩略图、获取视频属性
依赖引入
<!--javaCV 视频工具--><dependency><groupId>org.bytedeco</groupId><artifactId>javacv-platform</artifactId><version>1.5</version></dependency>
实现
@Slf4j
public class VideoUtils {private static final String IMAGEMAT = "png";private static final String ROTATE = "rotate";/*** 默认截取视频的中间帧为封面*/public static final int MOD = 2;/*** 视频缩略图后缀*/private static final String VIDEO_THUMBNAIL_SUF = "th.png";/*** 视频缩略图前缀*/private static final String VIDEO_THUMBNAIL_PRE = "video/thumbnail/";private static final String SYMBOL = ".";/*** 获取视频缩略图* @param filePath:视频路径* @param mod:视频长度/mod获取第几帧* @throws Exception*/public static String randomGrabberFFmpegImage(String filePath, int mod) {String targetFilePath = "";try{FFmpegFrameGrabber ff = FFmpegFrameGrabber.createDefault(filePath);ff.start();//图片位置是否正确String rotate = ff.getVideoMetadata(ROTATE);//获取帧数int ffLength = ff.getLengthInFrames();Frame f;int i = 0;//设置截取帧数int index = ffLength / mod;while (i < ffLength) {f = ff.grabImage();if(i == index){if (null != rotate && rotate.length() > 1) {OpenCVFrameConverter.ToIplImage converter = new OpenCVFrameConverter.ToIplImage();IplImage src = converter.convert(f);f = converter.convert(rotate(src, Integer.parseInt(rotate)));}targetFilePath = getImagePath(filePath, i);doExecuteFrame(f, targetFilePath);break;}i++;}ff.stop();}catch (Exception e){log.error("获取视频缩略图异常:" + e.getMessage());}return targetFilePath;}/*** 随机生成生成缩略图存放路径* @param filePath:视频路径* @param index:第几帧* @return:缩略图的存放路径*/private static String getImagePath(String filePath, int index){String fileName = FileUtils.getName(filePath);//去后缀fileName = fileName.substring(0, fileName.indexOf(SYMBOL));return TencentCosConfig.baseUrl + VIDEO_THUMBNAIL_PRE + DateUtils.datePath() + "/" + fileName + "_" + index + VIDEO_THUMBNAIL_SUF;}/*** 旋转图片* @param src* @param angle* @return*/public static IplImage rotate(IplImage src, int angle) {IplImage img = IplImage.create(src.height(), src.width(), src.depth(), src.nChannels());opencv_core.cvTranspose(src, img);opencv_core.cvFlip(img, img, angle);return img;}/*** 截取缩略图* @param f* @param targerFilePath:封面图片*/public static void doExecuteFrame(Frame f, String targerFilePath) {COSClient cosClient = TencentCosUtils.initCosClient();if (null == f || null == f.image) {return;}Java2DFrameConverter converter = new Java2DFrameConverter();BufferedImage bi = converter.getBufferedImage(f);ByteArrayOutputStream out = new ByteArrayOutputStream();try {ImageIO.write(bi, IMAGEMAT, out);// 获取文件流InputStream bufferedImage = new ByteArrayInputStream(out.toByteArray());int length = out.size();ObjectMetadata objectMetadata = new ObjectMetadata();// 从输入流上传必须制定content length, 否则http客户端可能会缓存所有数据,存在内存OOM的情况objectMetadata.setContentLength(length);// 默认下载时根据cos路径key的后缀返回响应的contenttype, 上传时设置contenttype会覆盖默认值PutObjectRequest putObjectRequest = new PutObjectRequest(TencentCosConfig.bucket, targerFilePath, bufferedImage, objectMetadata);PutObjectResult putObjectResult = cosClient.putObject(putObjectRequest);log.info("腾讯COS上传视频缩略图成功:{}", putObjectResult.getETag());//关闭输入输出流bufferedImage.close();out.close();} catch (IOException e) {e.printStackTrace();} finally {cosClient.shutdown();}}/*** 根据视频长度随机生成随机数集合* @param baseNum:基础数字,此处为视频长度* @param length:随机数集合长度* @return:随机数集合*/public static List<Integer> random(int baseNum, int length) {List<Integer> list = new ArrayList<Integer>(length);while (list.size() < length) {Integer next = (int) (Math.random() * baseNum);if (list.contains(next)) {continue;}list.add(next);}Collections.sort(list);return list;}/*** 获取视频时长 单位/秒* @param video* @return*/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 inputStream 输入流* @return*/public static long getVideoDuration(InputStream inputStream) {long duration = 0L;FFmpegFrameGrabber ff = new FFmpegFrameGrabber(inputStream);try {ff.start();duration = ff.getLengthInTime() / (1000 * 1000);ff.stop();} catch (FrameGrabber.Exception e) {e.printStackTrace();}return duration;}/*** 转换视频文件为mp4* @param file* @return*/public static String convertToMp4(File file) {FFmpegFrameGrabber frameGrabber = new FFmpegFrameGrabber(file);String fileName = null;Frame captured_frame = null;FFmpegFrameRecorder recorder = null;try {frameGrabber.start();fileName = file.getAbsolutePath() + "__.mp4";recorder = new FFmpegFrameRecorder(fileName, frameGrabber.getImageWidth(), frameGrabber.getImageHeight(), frameGrabber.getAudioChannels());recorder.setVideoCodec(avcodec.AV_CODEC_ID_H264); //avcodec.AV_CODEC_ID_H264 //AV_CODEC_ID_MPEG4recorder.setFormat("mp4");recorder.setFrameRate(frameGrabber.getFrameRate());//recorder.setSampleFormat(frameGrabber.getSampleFormat()); //recorder.setSampleRate(frameGrabber.getSampleRate());recorder.setAudioChannels(frameGrabber.getAudioChannels());recorder.setFrameRate(frameGrabber.getFrameRate());recorder.start();while ((captured_frame = frameGrabber.grabFrame()) != null) {try {recorder.setTimestamp(frameGrabber.getTimestamp());recorder.record(captured_frame);} catch (FrameRecorder.Exception e) {e.printStackTrace();}}recorder.stop();recorder.release();frameGrabber.stop();} catch (Exception | FrameRecorder.Exception e) {e.printStackTrace();}return fileName;}}
文件笔记之javaCV 视频工具|获取视频时长|缩略图相关推荐
- java获取视频时长_Java获取视频的大小、时长
前端上传视频之后,根据上传的视频文件获取视频的大小和时长 1.获取视频时长 private String ReadVideoTime(File source) { Encoder encoder = ...
- 使用MATLAB读取视频并获取视频信息、分帧保存
题外话:初学MATLAB,是因为跟着老师做项目,与MATLAB机器学习相关,包含了智能信息处理,是从前未接触的领域.因此,想写博客来记录自己的学习进度.老师安排的第一次任务为:用MATLAB读取视频, ...
- html javascript 音频、视频、 mp3 、mp4 的播放、暂停、重新播放、获取音频时长、视频自动全屏播放
html javascript 音频.视频. mp3 .mp4 的播放.暂停.重新播放.获取音频时长 视频 https://www.bilibili.com/video/BV1WE411o7Ft?fr ...
- js 获取视频,者音频时长
js 获取视频,者音频时长 let fileUrl = URL.createObjectURL(file) let audioElement = new Audio(fileUrl) let time ...
- 【短视频SDK】合成时长和文件大小对比数据---给参数设置提供参考.
本文之前我们已经有一篇文章针对现在短视频SDK暴露的参数有一个基本解析:----->传送门:对焦模式.裁剪模式.视频质量.分辨率.视频比例.帧率.关键帧间隔等参数解析.做好一个短视频SDK的核心 ...
- java在linux转化mp3,linux下微信/qq的aud、silk音频文件格式与mp3格式互转,获取音频时长的方法,附问题分析和java代码。...
安装ffmpeg ffmpeg -codecs -可以看出ffmpeg默认的MP3格式无法编码为其它格式[D.A.L mp3]D=解码 E=编码 A=AudioCodec L=有损压缩 需要安装lam ...
- linux下微信/qq的aud、silk音频文件格式与mp3格式互转,获取音频时长的方法,附问题分析和java代码。
安装ffmpeg ffmpeg -codecs -可以看出ffmpeg默认的MP3格式无法编码为其它格式[D.A.L mp3]D=解码 E=编码 A=AudioCodec L=有损压缩 需要安装lam ...
- iOS 录音,获取录音时长及格式转换
转载请注明出处!!! 在APP中,我们也会遇到调用录音的功能,那么如何录音呢?并且在iOS中录音格式是wav或者caf格式的,和安卓不通用,为了达到通用的效果,我们还需要把他转换成通用格式.近期我遇到 ...
- python 获取mp3时长(时间长度)
python 获取mp3时长(时间长度) 第一种方法 import librosa import time def get_mp3_duration(audio_path):""& ...
最新文章
- DNS实现域名负载均衡
- 陈皓谈程序员的升级:职业规划就像软件工程
- 【VMCloud云平台】SCOM配置(四)-监控应用可用性
- SharedSDK微信分享不成功,分享之后没有反应
- 猪年看猪,猪男猪女一共十个。
- 【渝粤教育】国家开放大学2018年秋季 0239-21T电子商务物流管理 参考试题
- linuxpython升级3.5_linux升级python3.5到3.6
- 传聊天宝团队解散 罗永浩已退出股东行列
- [JS3] 立即执行JS
- 硅谷python_来自硅谷的Python最佳实践指南 | 极客时间
- linux日志级别的正确使用(printk)
- 2020中兴捧月算法大赛参赛总结
- 2020年中国保理行业市场现状分析,独立化、创新化和多产业渠道是发展关键「图」
- 《计算机工程》从投稿到录用之一手经验
- 打造属于自己的量化投资系统9——支持向量机SVM算法在股票预测涨跌中应用
- c语言ifmn除2余1,C语言编程题及答案 2
- Google浏览器密码框自动弹出账号密码的解决方法
- BPC BADI开发注意事项
- 盛志凡:TVOS技术解读
- 博通Broadcom SDK源码学习与开发5——ECOS系统层剖析