文件笔记之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 视频工具|获取视频时长|缩略图相关推荐

  1. java获取视频时长_Java获取视频的大小、时长

    前端上传视频之后,根据上传的视频文件获取视频的大小和时长 1.获取视频时长 private String ReadVideoTime(File source) { Encoder encoder = ...

  2. 使用MATLAB读取视频并获取视频信息、分帧保存

    题外话:初学MATLAB,是因为跟着老师做项目,与MATLAB机器学习相关,包含了智能信息处理,是从前未接触的领域.因此,想写博客来记录自己的学习进度.老师安排的第一次任务为:用MATLAB读取视频, ...

  3. html javascript 音频、视频、 mp3 、mp4 的播放、暂停、重新播放、获取音频时长、视频自动全屏播放

    html javascript 音频.视频. mp3 .mp4 的播放.暂停.重新播放.获取音频时长 视频 https://www.bilibili.com/video/BV1WE411o7Ft?fr ...

  4. js 获取视频,者音频时长

    js 获取视频,者音频时长 let fileUrl = URL.createObjectURL(file) let audioElement = new Audio(fileUrl) let time ...

  5. 【短视频SDK】合成时长和文件大小对比数据---给参数设置提供参考.

    本文之前我们已经有一篇文章针对现在短视频SDK暴露的参数有一个基本解析:----->传送门:对焦模式.裁剪模式.视频质量.分辨率.视频比例.帧率.关键帧间隔等参数解析.做好一个短视频SDK的核心 ...

  6. java在linux转化mp3,linux下微信/qq的aud、silk音频文件格式与mp3格式互转,获取音频时长的方法,附问题分析和java代码。...

    安装ffmpeg ffmpeg -codecs -可以看出ffmpeg默认的MP3格式无法编码为其它格式[D.A.L mp3]D=解码 E=编码 A=AudioCodec L=有损压缩 需要安装lam ...

  7. linux下微信/qq的aud、silk音频文件格式与mp3格式互转,获取音频时长的方法,附问题分析和java代码。

    安装ffmpeg ffmpeg -codecs -可以看出ffmpeg默认的MP3格式无法编码为其它格式[D.A.L mp3]D=解码 E=编码 A=AudioCodec L=有损压缩 需要安装lam ...

  8. iOS 录音,获取录音时长及格式转换

    转载请注明出处!!! 在APP中,我们也会遇到调用录音的功能,那么如何录音呢?并且在iOS中录音格式是wav或者caf格式的,和安卓不通用,为了达到通用的效果,我们还需要把他转换成通用格式.近期我遇到 ...

  9. python 获取mp3时长(时间长度)

    python 获取mp3时长(时间长度) 第一种方法 import librosa import time def get_mp3_duration(audio_path):""& ...

最新文章

  1. DNS实现域名负载均衡
  2. 陈皓谈程序员的升级:职业规划就像软件工程
  3. 【VMCloud云平台】SCOM配置(四)-监控应用可用性
  4. SharedSDK微信分享不成功,分享之后没有反应
  5. 猪年看猪,猪男猪女一共十个。
  6. 【渝粤教育】国家开放大学2018年秋季 0239-21T电子商务物流管理 参考试题
  7. linuxpython升级3.5_linux升级python3.5到3.6
  8. 传聊天宝团队解散 罗永浩已退出股东行列
  9. [JS3] 立即执行JS
  10. 硅谷python_来自硅谷的Python最佳实践指南 | 极客时间
  11. linux日志级别的正确使用(printk)
  12. 2020中兴捧月算法大赛参赛总结
  13. 2020年中国保理行业市场现状分析,独立化、创新化和多产业渠道是发展关键「图」
  14. 《计算机工程》从投稿到录用之一手经验
  15. 打造属于自己的量化投资系统9——支持向量机SVM算法在股票预测涨跌中应用
  16. c语言ifmn除2余1,C语言编程题及答案 2
  17. Google浏览器密码框自动弹出账号密码的解决方法
  18. BPC BADI开发注意事项
  19. 盛志凡:TVOS技术解读
  20. 博通Broadcom SDK源码学习与开发5——ECOS系统层剖析

热门文章

  1. 免认证的 php短信接口代码
  2. 一线互联网架构师设计思想解读开源框架!附超全教程文档
  3. 如何将pdf转换成html,怎么把PDF文件转换成HTML?PDF转HTML的最佳方法是什么?
  4. 网络字节序和IP地址详解
  5. php 汉王云名片_云名片
  6. 数组去重下标重排的php函数,php数组去重的函数代码
  7. Bahdanau 注意力
  8. 榆木搜官网_榆木:更多功能性前端!
  9. 强化学习笔记:多臂老虎机问题(7)--Gradient Bandit Algorithm
  10. DOM操作style属性